From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5763 invoked by alias); 11 Jul 2002 16:24:51 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 5754 invoked from network); 11 Jul 2002 16:24:50 -0000 Received: from unknown (HELO tetsuo.nj.caldera.com) (63.124.204.226) by sources.redhat.com with SMTP; 11 Jul 2002 16:24:50 -0000 Received: from caldera.com (localhost.localdomain [127.0.0.1]) by tetsuo.nj.caldera.com (8.11.6/8.11.6) with ESMTP id g6BGbB404860; Thu, 11 Jul 2002 12:37:11 -0400 Message-ID: <3D2DB435.AC2C6DA0@caldera.com> Date: Thu, 11 Jul 2002 10:37:00 -0000 From: Petr Sorfa Organization: Caldera X-Accept-Language: en MIME-Version: 1.0 To: "gdb-patches@sources.redhat.com" Subject: [PATCH] DWARF support for .debug_loc offsets Content-Type: multipart/mixed; boundary="------------6559E325E4A2B6399EA05872" X-SW-Source: 2002-07/txt/msg00229.txt.bz2 This is a multi-part message in MIME format. --------------6559E325E4A2B6399EA05872 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-length: 1094 Hi, This patch provides support for offsets into .debug_loc. The patch does not include .debug_loc support in read_tag_string_type() as the DW_AT_string_length attribute is currently being misused by GCC (it uses it to hold the length, rather than the location to the length) and GDB supports the incorrect form. There is a second part of this patch which is dependent on FORTRAN95 support of modules and will be released later. 2002-07-11 Petr Sorfa (petrs@caldera.com) * dwarf2read.c (dwarf2_invalid_attrib_class): New complaint for invalid attribute class or form. (read_func_scope): DW_AT_frame_base attribute now supports .debug_loc offsets. (dwarf2_add_member_fn): DW_AT_vtable_elem_location attribute now supports .debug_loc offsets. (read_common_block): DW_AT_location attribute now supports .debug_loc offsets. (read_partial_die): DW_AT_location attribute now supports .debug_loc offsets. (new_symbol): DW_AT_external now supports .debug_loc offsets. --------------6559E325E4A2B6399EA05872 Content-Type: text/plain; charset=us-ascii; name="debug_loc_no_dep.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="debug_loc_no_dep.patch" Content-length: 9495 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) { --------------6559E325E4A2B6399EA05872--