X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fdwarf2read.c;h=8088830fca53d0fc895540f80161039ca1805367;hb=0b92b5bb46877299511949f5a437883ddb7dd60e;hp=630d9009700d0c668a1535214cb71122a2e938b0;hpb=53d72f980c60f6dd31d5be3546c4b22b8b10c06f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 630d900970..8088830fca 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -1,7 +1,7 @@ /* DWARF 2 debugging format support for GDB. Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2006, 2007, 2008, 2009 + 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology, @@ -58,6 +58,9 @@ #endif #ifdef HAVE_MMAP #include +#ifndef MAP_FAILED +#define MAP_FAILED ((void *) -1) +#endif #endif #if 0 @@ -546,8 +549,8 @@ struct attribute { char *str; struct dwarf_block *blk; - unsigned long unsnd; - long int snd; + ULONGEST unsnd; + LONGEST snd; CORE_ADDR addr; struct signatured_type *signatured_type; } @@ -766,7 +769,7 @@ dwarf2_invalid_attrib_class_complaint (const char *arg1, const char *arg2) static void dwarf2_locate_sections (bfd *, asection *, void *); #if 0 -static void dwarf2_build_psymtabs_easy (struct objfile *, int); +static void dwarf2_build_psymtabs_easy (struct objfile *); #endif static void dwarf2_create_include_psymtab (char *, struct partial_symtab *, @@ -776,7 +779,7 @@ static void dwarf2_build_include_psymtabs (struct dwarf2_cu *, struct die_info *, struct partial_symtab *); -static void dwarf2_build_psymtabs_hard (struct objfile *, int); +static void dwarf2_build_psymtabs_hard (struct objfile *); static void scan_partial_symbols (struct partial_die_info *, CORE_ADDR *, CORE_ADDR *, @@ -923,6 +926,13 @@ static void dwarf2_const_value_data (struct attribute *attr, static struct type *die_type (struct die_info *, struct dwarf2_cu *); +static int need_gnat_info (struct dwarf2_cu *); + +static struct type *die_descriptive_type (struct die_info *, struct dwarf2_cu *); + +static void set_descriptive_type (struct type *, struct die_info *, + struct dwarf2_cu *); + static struct type *die_containing_type (struct die_info *, struct dwarf2_cu *); @@ -1062,7 +1072,7 @@ static int is_ref_attr (struct attribute *); static unsigned int dwarf2_get_ref_die_offset (struct attribute *); -static int dwarf2_get_attr_constant_value (struct attribute *, int); +static LONGEST dwarf2_get_attr_constant_value (struct attribute *, int); static struct die_info *follow_die_ref_or_sig (struct die_info *, struct attribute *, @@ -1445,7 +1455,7 @@ dwarf2_get_section_info (struct objfile *objfile, const char *section_name, /* Build a partial symbol table. */ void -dwarf2_build_psymtabs (struct objfile *objfile, int mainline) +dwarf2_build_psymtabs (struct objfile *objfile) { dwarf2_read_section (objfile, &dwarf2_per_objfile->info); dwarf2_read_section (objfile, &dwarf2_per_objfile->abbrev); @@ -1458,9 +1468,7 @@ dwarf2_build_psymtabs (struct objfile *objfile, int mainline) dwarf2_read_section (objfile, &dwarf2_per_objfile->eh_frame); dwarf2_read_section (objfile, &dwarf2_per_objfile->frame); - if (mainline - || (objfile->global_psymbols.size == 0 - && objfile->static_psymbols.size == 0)) + if (objfile->global_psymbols.size == 0 && objfile->static_psymbols.size == 0) { init_psymbol_list (objfile, 1024); } @@ -1471,14 +1479,14 @@ dwarf2_build_psymtabs (struct objfile *objfile, int mainline) /* Things are significantly easier if we have .debug_aranges and .debug_pubnames sections */ - dwarf2_build_psymtabs_easy (objfile, mainline); + dwarf2_build_psymtabs_easy (objfile); } else #endif /* only test this case for now */ { /* In this case we have to work a bit harder */ - dwarf2_build_psymtabs_hard (objfile, mainline); + dwarf2_build_psymtabs_hard (objfile); } } @@ -1487,7 +1495,7 @@ dwarf2_build_psymtabs (struct objfile *objfile, int mainline) .debug_pubnames and .debug_aranges sections. */ static void -dwarf2_build_psymtabs_easy (struct objfile *objfile, int mainline) +dwarf2_build_psymtabs_easy (struct objfile *objfile) { bfd *abfd = objfile->obfd; char *aranges_buffer, *pubnames_buffer; @@ -2008,12 +2016,6 @@ process_psymtab_comp_unit (struct objfile *objfile, (objfile->static_psymbols.list + pst->statics_offset); sort_pst_symbols (pst); - /* If there is already a psymtab or symtab for a file of this - name, remove it. (If there is a symtab, more drastic things - also happen.) This happens in VxWorks. */ - if (! this_cu->from_debug_types) - free_named_symtabs (pst->filename); - info_ptr = (beg_of_comp_unit + cu.header.length + cu.header.initial_length_size); @@ -2072,7 +2074,7 @@ build_type_psymtabs (struct objfile *objfile) .debug_info and .debug_abbrev sections. */ static void -dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline) +dwarf2_build_psymtabs_hard (struct objfile *objfile) { /* Instead of reading this into a big buffer, we should probably use mmap() on architectures that support it. (FIXME) */ @@ -2384,7 +2386,8 @@ partial_die_parent_scope (struct partial_die_info *pdi, || parent->tag == DW_TAG_structure_type || parent->tag == DW_TAG_class_type || parent->tag == DW_TAG_interface_type - || parent->tag == DW_TAG_union_type) + || parent->tag == DW_TAG_union_type + || parent->tag == DW_TAG_enumeration_type) { if (grandparent_scope == NULL) parent->scope = parent->name; @@ -2392,7 +2395,7 @@ partial_die_parent_scope (struct partial_die_info *pdi, parent->scope = typename_concat (&cu->comp_unit_obstack, grandparent_scope, parent->name, cu); } - else if (parent->tag == DW_TAG_enumeration_type) + else if (parent->tag == DW_TAG_enumerator) /* Enumerators should not get the name of the enumeration as a prefix. */ parent->scope = grandparent_scope; else @@ -4563,7 +4566,7 @@ dwarf2_attach_fields_to_type (struct field_info *fip, struct type *type, TYPE_ALLOC (type, sizeof (struct field) * nfields); memset (TYPE_FIELDS (type), 0, sizeof (struct field) * nfields); - if (fip->non_public_fields) + if (fip->non_public_fields && cu->language != language_ada) { ALLOCATE_CPLUS_STRUCT_TYPE (type); @@ -4582,7 +4585,7 @@ dwarf2_attach_fields_to_type (struct field_info *fip, struct type *type, /* If the type has baseclasses, allocate and clear a bit vector for TYPE_FIELD_VIRTUAL_BITS. */ - if (fip->nbaseclasses) + if (fip->nbaseclasses && cu->language != language_ada) { int num_bytes = B_BYTES (fip->nbaseclasses); unsigned char *pointer; @@ -4616,11 +4619,13 @@ dwarf2_attach_fields_to_type (struct field_info *fip, struct type *type, switch (fieldp->accessibility) { case DW_ACCESS_private: - SET_TYPE_FIELD_PRIVATE (type, nfields); + if (cu->language != language_ada) + SET_TYPE_FIELD_PRIVATE (type, nfields); break; case DW_ACCESS_protected: - SET_TYPE_FIELD_PROTECTED (type, nfields); + if (cu->language != language_ada) + SET_TYPE_FIELD_PROTECTED (type, nfields); break; case DW_ACCESS_public: @@ -4640,6 +4645,8 @@ dwarf2_attach_fields_to_type (struct field_info *fip, struct type *type, { case DW_VIRTUALITY_virtual: case DW_VIRTUALITY_pure_virtual: + if (cu->language == language_ada) + error ("unexpected virtuality in component of Ada type"); SET_TYPE_FIELD_VIRTUAL (type, nfields); break; } @@ -4663,6 +4670,9 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die, struct nextfnfield *new_fnfield; struct type *this_type; + if (cu->language == language_ada) + error ("unexpected member function in Ada type"); + /* Get name of member function. */ fieldname = dwarf2_name (die, cu); if (fieldname == NULL) @@ -4836,6 +4846,9 @@ dwarf2_attach_fn_fields_to_type (struct field_info *fip, struct type *type, int total_length = 0; int i; + if (cu->language == language_ada) + error ("unexpected member functions in Ada type"); + ALLOCATE_CPLUS_STRUCT_TYPE (type); TYPE_FN_FIELDLISTS (type) = (struct fn_fieldlist *) TYPE_ALLOC (type, sizeof (struct fn_fieldlist) * fip->nfnfields); @@ -4879,68 +4892,48 @@ is_vtable_name (const char *name, struct dwarf2_cu *cu) } /* GCC outputs unnamed structures that are really pointers to member - functions, with the ABI-specified layout. If DIE (from CU) describes - such a structure, set its type, and return nonzero. Otherwise return - zero. + functions, with the ABI-specified layout. If TYPE describes + such a structure, smash it into a member function type. GCC shouldn't do this; it should just output pointer to member DIEs. This is GCC PR debug/28767. */ -static struct type * -quirk_gcc_member_function_pointer (struct die_info *die, struct dwarf2_cu *cu) +static void +quirk_gcc_member_function_pointer (struct type *type, struct objfile *objfile) { - struct objfile *objfile = cu->objfile; - struct type *type; - struct die_info *pfn_die, *delta_die; - struct attribute *pfn_name, *delta_name; - struct type *pfn_type, *domain_type; + struct type *pfn_type, *domain_type, *new_type; /* Check for a structure with no name and two children. */ - if (die->tag != DW_TAG_structure_type - || dwarf2_attr (die, DW_AT_name, cu) != NULL - || die->child == NULL - || die->child->sibling == NULL - || (die->child->sibling->sibling != NULL - && die->child->sibling->sibling->tag != DW_TAG_padding)) - return NULL; + if (TYPE_CODE (type) != TYPE_CODE_STRUCT || TYPE_NFIELDS (type) != 2) + return; /* Check for __pfn and __delta members. */ - pfn_die = die->child; - pfn_name = dwarf2_attr (pfn_die, DW_AT_name, cu); - if (pfn_die->tag != DW_TAG_member - || pfn_name == NULL - || DW_STRING (pfn_name) == NULL - || strcmp ("__pfn", DW_STRING (pfn_name)) != 0) - return NULL; - - delta_die = pfn_die->sibling; - delta_name = dwarf2_attr (delta_die, DW_AT_name, cu); - if (delta_die->tag != DW_TAG_member - || delta_name == NULL - || DW_STRING (delta_name) == NULL - || strcmp ("__delta", DW_STRING (delta_name)) != 0) - return NULL; + if (TYPE_FIELD_NAME (type, 0) == NULL + || strcmp (TYPE_FIELD_NAME (type, 0), "__pfn") != 0 + || TYPE_FIELD_NAME (type, 1) == NULL + || strcmp (TYPE_FIELD_NAME (type, 1), "__delta") != 0) + return; /* Find the type of the method. */ - pfn_type = die_type (pfn_die, cu); + pfn_type = TYPE_FIELD_TYPE (type, 0); if (pfn_type == NULL || TYPE_CODE (pfn_type) != TYPE_CODE_PTR || TYPE_CODE (TYPE_TARGET_TYPE (pfn_type)) != TYPE_CODE_FUNC) - return NULL; + return; /* Look for the "this" argument. */ pfn_type = TYPE_TARGET_TYPE (pfn_type); if (TYPE_NFIELDS (pfn_type) == 0 + /* || TYPE_FIELD_TYPE (pfn_type, 0) == NULL */ || TYPE_CODE (TYPE_FIELD_TYPE (pfn_type, 0)) != TYPE_CODE_PTR) - return NULL; + return; domain_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (pfn_type, 0)); - type = alloc_type (objfile); - smash_to_method_type (type, domain_type, TYPE_TARGET_TYPE (pfn_type), + new_type = alloc_type (objfile); + smash_to_method_type (new_type, domain_type, TYPE_TARGET_TYPE (pfn_type), TYPE_FIELDS (pfn_type), TYPE_NFIELDS (pfn_type), TYPE_VARARGS (pfn_type)); - type = lookup_methodptr_type (type); - return set_die_type (die, type, cu); + smash_to_methodptr_type (type, new_type); } /* Called when we find the DIE that starts a structure or union scope @@ -4968,10 +4961,6 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) char *name; struct cleanup *back_to = make_cleanup (null_cleanup, 0); - type = quirk_gcc_member_function_pointer (die, cu); - if (type) - return type; - /* If the definition of this type lives in .debug_types, read that type. Don't follow DW_AT_specification though, that will take us back up the chain and we want to go down. */ @@ -5037,6 +5026,8 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) if (die_is_declaration (die, cu)) TYPE_STUB (type) = 1; + set_descriptive_type (type, die, cu); + /* We need to add the type field to the die immediately so we don't infinitely recurse when dealing with pointers to the structure type within the structure itself. */ @@ -5148,6 +5139,8 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) } } + quirk_gcc_member_function_pointer (type, cu->objfile); + do_cleanups (back_to); return type; } @@ -5450,6 +5443,8 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu) if (name) TYPE_NAME (type) = name; + set_descriptive_type (type, die, cu); + do_cleanups (back_to); /* Install the type in the die. */ @@ -5878,6 +5873,11 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu) the default value DW_CC_normal. */ attr = dwarf2_attr (die, DW_AT_calling_convention, cu); TYPE_CALLING_CONVENTION (ftype) = attr ? DW_UNSND (attr) : DW_CC_normal; + + /* We need to add the subroutine type to the die immediately so + we don't infinitely recurse when dealing with parameters + declared as the same subroutine type. */ + set_die_type (die, ftype, cu); if (die->child != NULL) { @@ -5925,7 +5925,7 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu) } } - return set_die_type (die, ftype, cu); + return ftype; } static struct type * @@ -6040,9 +6040,10 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) struct type *base_type; struct type *range_type; struct attribute *attr; - int low = 0; - int high = -1; + LONGEST low = 0; + LONGEST high = -1; char *name; + LONGEST negative_mask; base_type = die_type (die, cu); if (TYPE_CODE (base_type) == TYPE_CODE_VOID) @@ -6089,6 +6090,13 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) high = dwarf2_get_attr_constant_value (attr, 1); } + negative_mask = + (LONGEST) -1 << (TYPE_LENGTH (base_type) * TARGET_CHAR_BIT - 1); + if (!TYPE_UNSIGNED (base_type) && (low & negative_mask)) + low |= negative_mask; + if (!TYPE_UNSIGNED (base_type) && (high & negative_mask)) + high |= negative_mask; + range_type = create_range_type (NULL, base_type, low, high); name = dwarf2_name (die, cu); @@ -6099,6 +6107,8 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) if (attr) TYPE_LENGTH (range_type) = DW_UNSND (attr); + set_descriptive_type (range_type, die, cu); + return set_die_type (die, range_type, cu); } @@ -6749,7 +6759,7 @@ read_partial_die (struct partial_die_info *part_die, default: part_die->name = dwarf2_canonicalize_name (DW_STRING (&attr), cu, - &cu->comp_unit_obstack); + &cu->objfile->objfile_obstack); break; } break; @@ -7126,8 +7136,8 @@ read_attribute_value (struct attribute *attr, unsigned form, { complaint (&symfile_complaints, - _("Suspicious DW_AT_byte_size value treated as zero instead of 0x%lx"), - DW_UNSND (attr)); + _("Suspicious DW_AT_byte_size value treated as zero instead of %s"), + hex_string (DW_UNSND (attr))); DW_UNSND (attr) = 0; } @@ -8449,8 +8459,15 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) if (attr2 && (DW_UNSND (attr2) != 0) && dwarf2_attr (die, DW_AT_type, cu) != NULL) { + struct pending **list_to_add; + + /* A variable with DW_AT_external is never static, but it + may be block-scoped. */ + list_to_add = (cu->list_in_scope == &file_symbols + ? &global_symbols : cu->list_in_scope); + SYMBOL_CLASS (sym) = LOC_UNRESOLVED; - add_symbol_to_list (sym, cu->list_in_scope); + add_symbol_to_list (sym, list_to_add); } else if (!die_is_declaration (die, cu)) { @@ -8747,6 +8764,67 @@ die_type (struct die_info *die, struct dwarf2_cu *cu) return type; } +/* True iff CU's producer generates GNAT Ada auxiliary information + that allows to find parallel types through that information instead + of having to do expensive parallel lookups by type name. */ + +static int +need_gnat_info (struct dwarf2_cu *cu) +{ + /* FIXME: brobecker/2010-10-12: As of now, only the AdaCore version + of GNAT produces this auxiliary information, without any indication + that it is produced. Part of enhancing the FSF version of GNAT + to produce that information will be to put in place an indicator + that we can use in order to determine whether the descriptive type + info is available or not. One suggestion that has been made is + to use a new attribute, attached to the CU die. For now, assume + that the descriptive type info is not available. */ + return 0; +} + + +/* Return the auxiliary type of the die in question using its + DW_AT_GNAT_descriptive_type attribute. Returns NULL if the + attribute is not present. */ + +static struct type * +die_descriptive_type (struct die_info *die, struct dwarf2_cu *cu) +{ + struct type *type; + struct attribute *type_attr; + struct die_info *type_die; + + type_attr = dwarf2_attr (die, DW_AT_GNAT_descriptive_type, cu); + if (!type_attr) + return NULL; + + type_die = follow_die_ref (die, type_attr, &cu); + type = tag_type_to_type (type_die, cu); + if (!type) + { + dump_die_for_error (type_die); + error (_("Dwarf Error: Problem turning type die at offset into gdb type [in module %s]"), + cu->objfile->name); + } + return type; +} + +/* If DIE has a descriptive_type attribute, then set the TYPE's + descriptive type accordingly. */ + +static void +set_descriptive_type (struct type *type, struct die_info *die, + struct dwarf2_cu *cu) +{ + struct type *descriptive_type = die_descriptive_type (die, cu); + + if (descriptive_type) + { + ALLOCATE_GNAT_AUX_TYPE (type); + TYPE_DESCRIPTIVE_TYPE (type) = descriptive_type; + } +} + /* Return the containing type of the die in question using its DW_AT_containing_type attribute. */ @@ -10106,7 +10184,8 @@ dump_die_shallow (struct ui_file *f, int indent, struct die_info *die) case DW_FORM_data8: case DW_FORM_udata: case DW_FORM_sdata: - fprintf_unfiltered (f, "constant: %ld", DW_UNSND (&die->attrs[i])); + fprintf_unfiltered (f, "constant: %s", + pulongest (DW_UNSND (&die->attrs[i]))); break; case DW_FORM_sig8: if (DW_SIGNATURED_TYPE (&die->attrs[i]) != NULL) @@ -10229,10 +10308,10 @@ dwarf2_get_ref_die_offset (struct attribute *attr) return 0; } -/* Return the constant value held by the given attribute. Return -1 - if the value held by the attribute is not constant. */ +/* Return the constant value held by ATTR. Return DEFAULT_VALUE if + * the value held by the attribute is not constant. */ -static int +static LONGEST dwarf2_get_attr_constant_value (struct attribute *attr, int default_value) { if (attr->form == DW_FORM_sdata) @@ -11702,6 +11781,19 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) { struct dwarf2_offset_and_type **slot, ofs; + /* For Ada types, make sure that the gnat-specific data is always + initialized (if not already set). There are a few types where + we should not be doing so, because the type-specific area is + already used to hold some other piece of info (eg: TYPE_CODE_FLT + where the type-specific area is used to store the floatformat). + But this is not a problem, because the gnat-specific information + is actually not needed for these types. */ + if (need_gnat_info (cu) + && TYPE_CODE (type) != TYPE_CODE_FUNC + && TYPE_CODE (type) != TYPE_CODE_FLT + && !HAVE_GNAT_AUX_INFO (type)) + INIT_GNAT_SPECIFIC (type); + if (cu->type_hash == NULL) { gdb_assert (cu->per_cu != NULL);