74 lines
2.2 KiB
Diff
74 lines
2.2 KiB
Diff
|
--- gdb/Makefile.in
|
||
|
+++ gdb/Makefile.in
|
||
|
@@ -2538,7 +2538,7 @@
|
||
|
$(reggroups_h) $(libbfd_h) $(coff_internal_h) $(libcoff_h) \
|
||
|
$(coff_xcoff_h) $(libxcoff_h) $(elf_bfd_h) $(solib_svr4_h) \
|
||
|
$(ppc_tdep_h) $(gdb_assert_h) $(dis_asm_h) $(trad_frame_h) \
|
||
|
- $(frame_unwind_h) $(frame_base_h) $(rs6000_tdep_h)
|
||
|
+ $(frame_unwind_h) $(frame_base_h) $(rs6000_tdep_h) $(dwarf2_frame_h)
|
||
|
rs6000-aix-tdep.o: rs6000-aix-tdep.c $(defs_h) $(osabi_h) $(rs6000_tdep_h)
|
||
|
s390-nat.o: s390-nat.c $(defs_h) $(tm_h) $(regcache_h) $(inferior_h) \
|
||
|
$(s390_tdep_h) $(target_h) $(linux_nat_h)
|
||
|
--- gdb/rs6000-tdep.c
|
||
|
+++ gdb/rs6000-tdep.c
|
||
|
@@ -40,6 +40,7 @@
|
||
|
#include "sim-regno.h"
|
||
|
#include "gdb/sim-ppc.h"
|
||
|
#include "reggroups.h"
|
||
|
+#include "dwarf2-frame.h"
|
||
|
|
||
|
#include "libbfd.h" /* for bfd_default_set_arch_mach */
|
||
|
#include "coff/internal.h" /* for libcoff.h */
|
||
|
@@ -2243,6 +2244,40 @@
|
||
|
}
|
||
|
|
||
|
|
||
|
+/* Convert a .eh_frame register number to a Dwarf 2 register number. */
|
||
|
+static int
|
||
|
+rs6000_eh_frame_regnum (struct gdbarch *gdbarch, int num)
|
||
|
+{
|
||
|
+ if (0 <= num && num <= 63) /* r0-r31,fp0-fp31 */
|
||
|
+ return num;
|
||
|
+ else if (68 <= num && num <= 75) /* cr0-cr8 */
|
||
|
+ return num - 68 + 86;
|
||
|
+ else if (77 <= num && num <= 108) /* vr0-vr31 */
|
||
|
+ return num - 77 + 1124;
|
||
|
+ else
|
||
|
+ switch (num)
|
||
|
+ {
|
||
|
+ case 64: /* mq */
|
||
|
+ return 100;
|
||
|
+ case 65: /* lr */
|
||
|
+ return 108;
|
||
|
+ case 66: /* ctr */
|
||
|
+ return 109;
|
||
|
+ case 76: /* xer */
|
||
|
+ return 101;
|
||
|
+ case 109: /* vrsave */
|
||
|
+ return 356;
|
||
|
+ case 110: /* vscr */
|
||
|
+ return 67;
|
||
|
+ case 111: /* spe_acc */
|
||
|
+ return 99;
|
||
|
+ case 112: /* spefscr */
|
||
|
+ return 612;
|
||
|
+ default:
|
||
|
+ return num;
|
||
|
+ }
|
||
|
+}
|
||
|
+
|
||
|
static void
|
||
|
rs6000_store_return_value (struct type *type,
|
||
|
struct regcache *regcache,
|
||
|
@@ -3461,6 +3496,10 @@
|
||
|
/* Helpers for function argument information. */
|
||
|
set_gdbarch_fetch_pointer_argument (gdbarch, rs6000_fetch_pointer_argument);
|
||
|
|
||
|
+ /* Hook in the DWARF CFI frame unwinder. */
|
||
|
+ frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
|
||
|
+ dwarf2_frame_set_eh_frame_regnum (gdbarch, rs6000_eh_frame_regnum);
|
||
|
+
|
||
|
/* Hook in ABI-specific overrides, if they have been registered. */
|
||
|
gdbarch_init_osabi (info, gdbarch);
|
||
|
|