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 20:03:34 -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,1900 ---- 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) ! { ! complain (&dwarf2_complex_location_expr); ! addr = 0; ! } ! 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. */ --- 2372,2396 ---- /* 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) ! { ! complain (&dwarf2_complex_location_expr); ! } ! 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) { --- 2854,2876 ---- 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) ! { ! complain (&dwarf2_complex_location_expr); ! } ! 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); --- 3516,3538 ---- 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) ! { ! complain (&dwarf2_complex_location_expr); ! } ! 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 *** 4522,4528 **** char *name; struct attribute *attr = NULL; struct attribute *attr2 = NULL; ! CORE_ADDR addr; name = dwarf2_linkage_name (die); if (name) --- 4596,4602 ---- char *name; struct attribute *attr = NULL; struct attribute *attr2 = NULL; ! CORE_ADDR addr = 0; name = dwarf2_linkage_name (die); if (name) *************** 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 --- 4680,4704 ---- 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) ! { ! complain (&dwarf2_complex_location_expr); ! } ! 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) { --- 4721,4746 ---- } 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) ! { ! complain (&dwarf2_complex_location_expr); ! } ! else ! { ! complain (&dwarf2_invalid_attrib_class, "DW_AT_location", ! "external variable"); ! addr = 0; ! } add_symbol_to_list (sym, list_in_scope); if (optimized_out) {