From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9182 invoked by alias); 23 Apr 2008 21:31:20 -0000 Received: (qmail 9165 invoked by uid 22791); 23 Apr 2008 21:31:18 -0000 X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org (qpsmtpd/0.31) with ESMTP; Wed, 23 Apr 2008 21:31:01 +0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id m3NLUx41024387 for ; Wed, 23 Apr 2008 17:30:59 -0400 Received: from pobox.stuttgart.redhat.com (pobox.stuttgart.redhat.com [172.16.2.10]) by int-mx1.corp.redhat.com (8.13.1/8.13.1) with ESMTP id m3NLUwrm008421 for ; Wed, 23 Apr 2008 17:30:59 -0400 Received: from host0.dyn.jankratochvil.net (sebastian-int.corp.redhat.com [172.16.52.221]) by pobox.stuttgart.redhat.com (8.13.1/8.13.1) with ESMTP id m3NLUuTB009640 for ; Wed, 23 Apr 2008 17:30:57 -0400 Received: from host0.dyn.jankratochvil.net (localhost [127.0.0.1]) by host0.dyn.jankratochvil.net (8.14.2/8.14.1) with ESMTP id m3NLUuuI022340 for ; Wed, 23 Apr 2008 23:30:56 +0200 Received: (from jkratoch@localhost) by host0.dyn.jankratochvil.net (8.14.2/8.14.2/Submit) id m3NLUtUe022339 for gdb-patches@sources.redhat.com; Wed, 23 Apr 2008 23:30:55 +0200 Date: Wed, 23 Apr 2008 22:18:00 -0000 From: Jan Kratochvil To: gdb-patches@sources.redhat.com Subject: [patch] [1/2] Discontiguous PSYMTABs (partial DIEs base address) Message-ID: <20080423213055.GB11894@host0.dyn.jankratochvil.net> References: <20071009181701.GA30757@caradoc.them.org> <20071009185434.GA27810@host0.dyn.jankratochvil.net> <20071009185931.GA1220@caradoc.them.org> <20071124154339.GA14913@host0.dyn.jankratochvil.net> <20071130111021.GA17867@host0.dyn.jankratochvil.net> <20071130145613.GA5941@caradoc.them.org> <20071209203138.GA23339@host0.dyn.jankratochvil.net> <20071217005641.GA14690@caradoc.them.org> <20071217010217.GB14690@caradoc.them.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="7LkOrbQMr4cezO2T" Content-Disposition: inline In-Reply-To: <20071217010217.GB14690@caradoc.them.org> User-Agent: Mutt/1.5.17 (2007-11-01) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-04/txt/msg00535.txt.bz2 --7LkOrbQMr4cezO2T Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 781 Hi, It fixes this testcase run (when `complaints' is on): -Reading symbols from /home/jkratoch/redhat/sources/gdb/testsuite/gdb.cp/m-static...Invalid .debug_ranges data (no base address)...done. +Reading symbols from /home/jkratoch/redhat/sources/gdb/testsuite/gdb.cp/m-static...done. Currently the base address required for the CU DW_AT_ranges resolution is set only during full symbols reading which is too late for the secondary patch which uses OBJFILE->PSYMTABS_ADDRMAP built from these ranges to find which psymtabs expand to the full symtabs (chicken-egg problem). It has no real benefits but it is a non-regression standalone patch required by the next patch [2/2]. Going to post the results of some more verifications, posting as Doug Evans has asked. Regards, Jan --7LkOrbQMr4cezO2T Content-Type: text/plain; charset=us-ascii Content-Disposition: inline; filename="gdb-cvs-psymtab-base_address.patch" Content-length: 2138 2008-04-21 Jan Kratochvil Set CU BASE_ADDRESS already from partial DIEs. * dwarf2read.c (read_partial_die): New variables BASE_ADDRESS and BASE_ADDRESS_TYPE. Set these variables from DW_AT_LOW_PC and DW_AT_ENTRY_PC. Set CU->HEADER.BASE_KNOWN and CU->HEADER.BASE_ADDRESS from these variables if it was still unset. --- ./gdb/dwarf2read.c 19 Apr 2008 05:06:54 -0000 1.255 +++ ./gdb/dwarf2read.c 21 Apr 2008 13:49:11 -0000 @@ -5808,6 +5851,15 @@ read_partial_die (struct partial_die_inf struct attribute attr; int has_low_pc_attr = 0; int has_high_pc_attr = 0; + CORE_ADDR base_address; + enum + { + base_address_none, + base_address_low_pc, + /* Overrides BASE_ADDRESS_LOW_PC. */ + base_address_entry_pc + } + base_address_type = base_address_none; memset (part_die, 0, sizeof (struct partial_die_info)); @@ -5845,11 +5897,25 @@ read_partial_die (struct partial_die_inf case DW_AT_low_pc: has_low_pc_attr = 1; part_die->lowpc = DW_ADDR (&attr); + if (part_die->tag == DW_TAG_compile_unit + && base_address_type < base_address_low_pc) + { + base_address = DW_ADDR (&attr); + base_address_type = base_address_low_pc; + } break; case DW_AT_high_pc: has_high_pc_attr = 1; part_die->highpc = DW_ADDR (&attr); break; + case DW_AT_entry_pc: + if (part_die->tag == DW_TAG_compile_unit + && base_address_type < base_address_entry_pc) + { + base_address = DW_ADDR (&attr); + base_address_type = base_address_entry_pc; + } + break; case DW_AT_ranges: if (dwarf2_ranges_read (DW_UNSND (&attr), &part_die->lowpc, &part_die->highpc, cu)) @@ -5942,6 +6010,14 @@ read_partial_die (struct partial_die_inf && (part_die->lowpc != 0 || dwarf2_per_objfile->has_section_at_zero)) part_die->has_pc_info = 1; + + if (base_address_type != base_address_none && !cu->header.base_known) + { + gdb_assert (part_die->tag == DW_TAG_compile_unit); + cu->header.base_known = 1; + cu->header.base_address = base_address; + } + return info_ptr; } --7LkOrbQMr4cezO2T--