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 11 Jul 2002 16:11:08 -0000 *************** static struct complaint dwarf2_macro_spa *** 658,663 **** --- 658,667 ---- { "macro definition contains spaces in formal argument list:\n`%s'", 0, 0 }; + static struct complaint dwarf2_invalid_attrib_class = + { + "invalid attribute class or form for '%s' in '%s'", 0, 0 + }; /* local function prototypes */ *************** read_func_scope (struct die_info *die, s *** 1870,1876 **** attr = dwarf_attr (die, DW_AT_frame_base); if (attr) { ! CORE_ADDR addr = decode_locdesc (DW_BLOCK (attr), objfile, cu_header); if (isderef) complain (&dwarf2_unsupported_at_frame_base, name); else if (isreg) --- 1874,1904 ---- attr = dwarf_attr (die, DW_AT_frame_base); if (attr) { ! CORE_ADDR addr; ! ! /* Support the .debug_loc offsets */ ! if (attr->form == DW_FORM_block1 ! || attr->form == DW_FORM_block2 ! || attr->form == DW_FORM_block4 ! || attr->form == DW_FORM_block) ! { ! addr = decode_locdesc (DW_BLOCK (attr), objfile, cu_header); ! } ! else if (attr->form == DW_FORM_data4 || attr->form == DW_FORM_data8) ! { ! int bytes_read; ! ! /* Offset from .debug_loc */ ! addr = read_address (objfile->obfd, ! (char *)(DW_UNSND (attr) + dwarf_loc_offset), ! cu_header, &bytes_read); ! } ! else ! { ! complain (&dwarf2_invalid_attrib_class, "DW_AT_frame_base", name); ! addr = 0; ! } ! if (isderef) complain (&dwarf2_unsupported_at_frame_base, name); else if (isreg) *************** dwarf2_add_member_fn (struct field_info *** 2348,2354 **** /* 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; } /* Create the vector of member function fields, and attach it to the type. */ --- 2376,2405 ---- /* Get index in virtual function table if it is a virtual member function. */ attr = dwarf_attr (die, DW_AT_vtable_elem_location); if (attr) ! { ! /* Support the .debug_loc offsets */ ! if (attr->form == DW_FORM_block1 ! || attr->form == DW_FORM_block2 ! || attr->form == DW_FORM_block4 ! || attr->form == DW_FORM_block) ! { ! fnp->voffset = decode_locdesc (DW_BLOCK (attr), objfile, cu_header) + 2; ! } ! else if (attr->form == DW_FORM_data4 || attr->form == DW_FORM_data8) ! { ! int bytes_read; ! ! /* Offset from .debug_loc */ ! fnp->voffset = read_address (objfile->obfd, ! (char *)(DW_UNSND (attr) + dwarf_loc_offset), ! cu_header, &bytes_read) + 2; ! } ! else ! { ! complain (&dwarf2_invalid_attrib_class, "DW_AT_vtable_elem_location", ! fieldname); ! } ! } } /* Create the vector of member function fields, and attach it to the type. */ *************** read_common_block (struct die_info *die, *** 2812,2818 **** attr = dwarf_attr (die, DW_AT_location); if (attr) { ! base = decode_locdesc (DW_BLOCK (attr), objfile, cu_header); } if (die->has_children) { --- 2863,2890 ---- attr = dwarf_attr (die, DW_AT_location); if (attr) { ! /* Support the .debug_loc offsets */ ! if (attr->form == DW_FORM_block1 ! || attr->form == DW_FORM_block2 ! || attr->form == DW_FORM_block4 ! || attr->form == DW_FORM_block) ! { ! base = decode_locdesc (DW_BLOCK (attr), objfile, cu_header); ! } ! else if (attr->form == DW_FORM_data4 || attr->form == DW_FORM_data8) ! { ! int bytes_read; ! ! /* Offset from .debug_loc */ ! base = read_address (objfile->obfd, ! (char *)(DW_UNSND (attr) + dwarf_loc_offset), ! cu_header, &bytes_read); ! } ! else ! { ! complain (&dwarf2_invalid_attrib_class, "DW_AT_location", ! "common block member"); ! } } if (die->has_children) { *************** read_partial_die (struct partial_die_inf *** 3458,3464 **** part_die->highpc = DW_ADDR (&attr); break; case DW_AT_location: ! part_die->locdesc = DW_BLOCK (&attr); break; case DW_AT_language: part_die->language = DW_UNSND (&attr); --- 3530,3557 ---- part_die->highpc = DW_ADDR (&attr); break; case DW_AT_location: ! /* Support the .debug_loc offsets */ ! if (attr.form == DW_FORM_block1 ! || attr.form == DW_FORM_block2 ! || attr.form == DW_FORM_block4 ! || attr.form == DW_FORM_block) ! { ! part_die->locdesc = DW_BLOCK (&attr); ! } ! else if (attr.form == DW_FORM_data4 || attr.form == DW_FORM_data8) ! { ! /* Offset from .debug_loc */ ! int bytes_read; ! ! part_die->locdesc = (struct dwarf_block *)read_address (abfd, ! (char *)(DW_UNSND (&attr) + dwarf_loc_offset), ! cu_header, &bytes_read); ! } ! else ! { ! complain (&dwarf2_invalid_attrib_class, "DW_AT_location", ! "partial symbol information"); ! } break; case DW_AT_language: part_die->language = DW_UNSND (&attr); *************** new_symbol (struct die_info *die, struct *** 4606,4613 **** attr2 = dwarf_attr (die, DW_AT_external); if (attr2 && (DW_UNSND (attr2) != 0)) { ! SYMBOL_VALUE_ADDRESS (sym) = ! decode_locdesc (DW_BLOCK (attr), objfile, cu_header); add_symbol_to_list (sym, &global_symbols); /* In shared libraries the address of the variable --- 4699,4729 ---- attr2 = dwarf_attr (die, DW_AT_external); if (attr2 && (DW_UNSND (attr2) != 0)) { ! /* Support the .debug_loc offsets */ ! if (attr->form == DW_FORM_block1 ! || attr->form == DW_FORM_block2 ! || attr->form == DW_FORM_block4 ! || attr->form == DW_FORM_block) ! { ! SYMBOL_VALUE_ADDRESS (sym) = ! decode_locdesc (DW_BLOCK (attr), objfile, cu_header); ! } ! else if (attr->form == DW_FORM_data4 ! || attr->form == DW_FORM_data8) ! { ! int bytes_read; ! ! /* Offset from .debug_loc */ ! SYMBOL_VALUE_ADDRESS (sym) = ! read_address (objfile->obfd, ! (char *)(DW_UNSND (attr) + dwarf_loc_offset), ! cu_header, &bytes_read); ! } ! else ! { ! complain (&dwarf2_invalid_attrib_class, "DW_AT_location", ! "external variable"); ! } add_symbol_to_list (sym, &global_symbols); /* In shared libraries the address of the variable *************** new_symbol (struct die_info *die, struct *** 4630,4637 **** } else { ! SYMBOL_VALUE (sym) = addr = ! decode_locdesc (DW_BLOCK (attr), objfile, cu_header); add_symbol_to_list (sym, list_in_scope); if (optimized_out) { --- 4746,4777 ---- } else { ! /* Support the .debug_loc offsets */ ! if (attr->form == DW_FORM_block1 ! || attr->form == DW_FORM_block2 ! || attr->form == DW_FORM_block4 ! || attr->form == DW_FORM_block) ! { ! SYMBOL_VALUE (sym) = addr = ! decode_locdesc (DW_BLOCK (attr), objfile, cu_header); ! } ! else if (attr->form == DW_FORM_data4 ! || attr->form == DW_FORM_data8) ! { ! int bytes_read; ! ! /* Offset from .debug_loc */ ! SYMBOL_VALUE (sym) = addr = ! read_address (objfile->obfd, ! (char *)(DW_UNSND (attr) + dwarf_loc_offset), ! cu_header, &bytes_read); ! } ! else ! { ! complain (&dwarf2_invalid_attrib_class, "DW_AT_location", ! "external variable"); ! addr = 0; ! } add_symbol_to_list (sym, list_in_scope); if (optimized_out) {