Re: [PATCH] Fix dwarf register column to gdb register mapping

John David Anglin
2008-09-15T02:08:26Z

> > When I enabled the dwarf debugging support in gdb before i caused
> > various errors and warnings about incorrect cfi. Do you still see that
> > with this enabled? Is it compiler dependent? Because of those warnings
> > and errors I had disabled the dwarf stuff on hppa before.
>
> Investigating some more, I see there's a problem with the floating
> point registers. A break on wack_double demonstrates the problem
> on both hppa64-hpux and hppa-linux:

The following change fixes the problem. The confusion was between "dbx"
register numbers and "dwarf" register columns. The hppa64 implementation
was essentially correct except for a botched if statement. I tried to
make it clear in the change that the mapping is for dbx registers.

As far as I can tell, the dwarf debugging support is now enabled by default
and the ifdef'd out code no longer works to disable it. So, the mapping
had to be fixed.

Committed as follows.

Dave
--
J. David Anglin dave.anglin@nrc-cnrc.gc.ca
National Research Council of Canada (613) 990-0752 (FAX: 952-6602)

2008-09-14 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>

* hppa-linux-tdep.c (hppa_dwarf_reg_to_regnum): Remove surrounding
"#if 0" "#endif". Fix mapping of DWARF DBX registers to GDB registers.
Correct arguments and improve comments.
(hppa_linux_init_abi): Call set_gdbarch_dwarf2_reg_to_regnum. Delete
disabled code.
* hppa-tdep.c (hppa64_dwarf_reg_to_regnum): Fix check for floating
point DBX register, change error to warning, and improve comments.

Index: hppa-linux-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/hppa-linux-tdep.c,v
retrieving revision 1.32
diff -u -3 -p -r1.32 hppa-linux-tdep.c
--- hppa-linux-tdep.c 14 Sep 2008 14:08:42 -0000 1.32
+++ hppa-linux-tdep.c 15 Sep 2008 01:33:28 -0000
@@ -34,24 +34,21 @@

#include "elf/common.h"

-#if 0
-/* Convert DWARF register number REG to the appropriate register
- number used by GDB. */
+/* Map DWARF DBX register numbers to GDB register numbers. */
static int
-hppa_dwarf_reg_to_regnum (int reg)
+hppa_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
{
- /* registers 0 - 31 are the same in both sets */
- if (reg < 32)
+ /* The general registers and the sar are the same in both sets. */
+ if (reg <= 32)
return reg;

- /* dwarf regs 32 to 85 are fpregs 4 - 31 */
- if (reg >= 32 && reg <= 85)
- return HPPA_FP4_REGNUM + (reg - 32);
+ /* fr4-fr31 (left and right halves) are mapped from 72. */
+ if (reg >= 72 && reg <= 72 + 28 * 2)
+ return HPPA_FP4_REGNUM + (reg - 72);

- warning (_("Unmapped DWARF Register #%d encountered."), reg);
+ warning (_("Unmapped DWARF DBX Register #%d encountered."), reg);
return -1;
}
-#endif

static void
hppa_linux_target_write_pc (struct regcache *regcache, CORE_ADDR v)
@@ -545,12 +545,7 @@ hppa_linux_init_abi (struct gdbarch_info
set_gdbarch_regset_from_core_section
(gdbarch, hppa_linux_regset_from_core_section);

-#if 0
- /* Dwarf-2 unwinding support. Not yet working. */
set_gdbarch_dwarf2_reg_to_regnum (gdbarch, hppa_dwarf_reg_to_regnum);
- frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
- frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer);
-#endif

/* Enable TLS support. */
set_gdbarch_fetch_tls_load_module_address (gdbarch,
Index: hppa-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/hppa-tdep.c,v
retrieving revision 1.260
diff -u -3 -p -r1.260 hppa-tdep.c
--- hppa-tdep.c 11 Sep 2008 14:23:15 -0000 1.260
+++ hppa-tdep.c 15 Sep 2008 01:33:29 -0000
@@ -658,18 +658,19 @@ hppa64_register_name (struct gdbarch *gd
return names[i];
}

+/* Map dwarf DBX register numbers to GDB register numbers. */
static int
hppa64_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
{
- /* r0-r31 and sar map one-to-one. */
+ /* The general registers and the sar are the same in both sets. */
if (reg <= 32)
return reg;

/* fr4-fr31 are mapped from 72 in steps of 2. */
- if (reg >= 72 || reg < 72 + 28 * 2)
+ if (reg >= 72 && reg < 72 + 28 * 2 && !(reg & 1))
return HPPA64_FP4_REGNUM + (reg - 72) / 2;

- error ("Invalid DWARF register num %d.", reg);
+ warning (_("Unmapped DWARF DBX Register #%d encountered."), reg);
return -1;
}