This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[patch] Fix CU relative vs. absolute offsets [Re: RFC: problem with DW_OP_GNU_deref_type and dwarf's get_base_type callback]
- From: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- To: Joel Brobecker <brobecker at adacore dot com>
- Cc: gdb-patches at sourceware dot org
- Date: Wed, 7 Mar 2012 18:09:40 +0100
- Subject: [patch] Fix CU relative vs. absolute offsets [Re: RFC: problem with DW_OP_GNU_deref_type and dwarf's get_base_type callback]
- References: <20120305223429.GM2867@adacore.com>
On Mon, 05 Mar 2012 23:34:29 +0100, Joel Brobecker wrote:
> I tested the change, and lo and behold, on x86_64-linux, I get the
> following fixes:
>
> * gdb.arch:
> +------------+------------+----------------------------------------------------+
> | FAIL | PASS | amd64-entry-value.exp: entry: bt |
I do not understand how it can happen. amd64-entry-value.exp uses precompiled
amd64-entry-value.s (unless you use runtest COMPILE=1) and sure it fully
PASSed+PASSes for me.
There are more issues of this kind.
I will re-review the patch later but it seems to me these fixes are needed.
No regressions on {x86_64,x86_64-m32,i686}-fedora17-linux-gnu and with
-gdwarf-4 -fdebug-types-section.
It looks as if some of the GDB features have never worked in real world - just
in the testcase which have single CU. :-)
Thanks,
Jan
2012-03-07 Jan Kratochvil <jan.kratochvil@redhat.com>
Fix CU relative vs. absolute DIE offsets.
* dwarf2loc.h (dwarf2_fetch_die_location_block): Rename parameter
offset to offset_in_cu.
* dwarf2read.c (process_enumeration_scope): Add CU offset to
TYPE_OFFSET.
(dwarf2_fetch_die_location_block): Rename parameter offset to
offset_in_cu. New variable offset, add CU offset to OFFSET_IN_CU.
--- a/gdb/dwarf2loc.h
+++ b/gdb/dwarf2loc.h
@@ -61,7 +61,7 @@ const gdb_byte *dwarf2_find_location_expression
CORE_ADDR pc);
struct dwarf2_locexpr_baton dwarf2_fetch_die_location_block
- (unsigned int offset, struct dwarf2_per_cu_data *per_cu,
+ (unsigned int offset_in_cu, struct dwarf2_per_cu_data *per_cu,
CORE_ADDR (*get_frame_pc) (void *baton),
void *baton);
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -8031,7 +8031,8 @@ process_enumeration_scope (struct die_info *die, struct dwarf2_cu *cu)
= lookup_signatured_type_at_offset (dwarf2_per_objfile->objfile,
cu->per_cu->debug_types_section,
cu->per_cu->offset);
- if (type_sig->type_offset != die->offset)
+ if (type_sig->per_cu.offset + type_sig->type_offset
+ != die->offset)
return;
}
@@ -14202,11 +14203,12 @@ follow_die_ref (struct die_info *src_die, struct attribute *attr,
dwarf2_locexpr_baton->data has lifetime of PER_CU->OBJFILE. */
struct dwarf2_locexpr_baton
-dwarf2_fetch_die_location_block (unsigned int offset,
+dwarf2_fetch_die_location_block (unsigned int offset_in_cu,
struct dwarf2_per_cu_data *per_cu,
CORE_ADDR (*get_frame_pc) (void *baton),
void *baton)
{
+ unsigned int offset = per_cu->offset + offset_in_cu;
struct dwarf2_cu *cu;
struct die_info *die;
struct attribute *attr;