[PATCH]: Get dwarf2 working on sparc64 too.

David S. Miller davem@davemloft.net
Thu Apr 6 00:16:00 GMT 2006


There were two problems:

1) The sparc32 registry of the dwarf2 reg_init function has
   to occur before osabi init, so that osabi can override
   properly.

2) We have to mark the global registers as explicitly undefined.
   Besides, they are call clobbered.

   This handles the case where gcc emits a DW_CFA_GNU_window_save,
   which causes the gdb dwarf2 frame code to allocate a reg set out
   to 32 registers, but it only sets up entries 8 --> 16.  We get ugly
   warnings.

And this also enables the dwarf2 frame sniffer on sparc64/Linux.

No regressions in the test suite on both sparc32/Linux and
sparc64/Linux.

Ok to apply?

2006-04-05  David S. Miller  <davem@sunset.davemloft.net>

	* sparc64-linux-tdep.c (sparc64_linux_init_abi): Append dwarf2
	frame sniffer.
	* sparc-tdep.c (sparc32_gdbarch_init): Make sure to call
	dwarf2_frame_set_init_reg() before gdbarch_init_osabi() so
	that the latter can override.
	(sparc32_dwarf2_frame_init_reg): Mark global registers as
	undefined.
	* sparc64-tdep.c (sparc64_dwarf2_frame_init_reg): Likewise.
	* Makefile.in (sparc64-linux-tdep.o): Update dependencies.

--- ./sparc64-linux-tdep.c.~1~	2006-04-05 12:18:50.000000000 -0700
+++ ./sparc64-linux-tdep.c	2006-04-05 14:27:31.000000000 -0700
@@ -22,6 +22,7 @@
 #include "defs.h"
 #include "frame.h"
 #include "frame-unwind.h"
+#include "dwarf2-frame.h"
 #include "gdbarch.h"
 #include "osabi.h"
 #include "solib-svr4.h"
@@ -106,6 +107,9 @@ sparc64_linux_init_abi (struct gdbarch_i
 
   tramp_frame_prepend_unwinder (gdbarch, &sparc64_linux_rt_sigframe);
 
+  /* Hook in the DWARF CFI frame unwinder.  */
+  frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
+
   sparc64_init_abi (info, gdbarch);
 
   /* GNU/Linux has SVR4-style shared libraries...  */
--- ./sparc-tdep.c.~1~	2006-04-05 12:07:20.000000000 -0700
+++ ./sparc-tdep.c	2006-04-05 16:48:44.000000000 -0700
@@ -1029,6 +1029,15 @@ sparc32_dwarf2_frame_init_reg (struct gd
 	 don't warn about that.  */
       reg->how = DWARF2_FRAME_REG_SAME_VALUE;
       break;
+    case SPARC_G1_REGNUM:
+    case SPARC_G2_REGNUM:
+    case SPARC_G3_REGNUM:
+    case SPARC_G4_REGNUM:
+    case SPARC_G5_REGNUM:
+    case SPARC_G6_REGNUM:
+    case SPARC_G7_REGNUM:
+      reg->how = DWARF2_FRAME_REG_UNDEFINED;
+      break;
     case SPARC_SP_REGNUM:
       reg->how = DWARF2_FRAME_REG_CFA;
       break;
@@ -1296,14 +1305,14 @@ sparc32_gdbarch_init (struct gdbarch_inf
 
   frame_base_set_default (gdbarch, &sparc32_frame_base);
 
-  /* Hook in ABI-specific overrides, if they have been registered.  */
-  gdbarch_init_osabi (info, gdbarch);
-
   /* Hook in the DWARF CFI frame unwinder.  */
   dwarf2_frame_set_init_reg (gdbarch, sparc32_dwarf2_frame_init_reg);
   /* FIXME: kettenis/20050423: Don't enable the unwinder until the
      StackGhost issues have been resolved.  */
 
+  /* Hook in ABI-specific overrides, if they have been registered.  */
+  gdbarch_init_osabi (info, gdbarch);
+
   frame_unwind_append_sniffer (gdbarch, sparc32_frame_sniffer);
 
   /* If we have register sets, enable the generic core file support.  */
--- ./sparc64-tdep.c.~1~	2006-04-05 11:59:49.000000000 -0700
+++ ./sparc64-tdep.c	2006-04-05 16:48:18.000000000 -0700
@@ -1117,6 +1117,15 @@ sparc64_dwarf2_frame_init_reg (struct gd
 	 don't warn about that.  */
       reg->how = DWARF2_FRAME_REG_SAME_VALUE;
       break;
+    case SPARC_G1_REGNUM:
+    case SPARC_G2_REGNUM:
+    case SPARC_G3_REGNUM:
+    case SPARC_G4_REGNUM:
+    case SPARC_G5_REGNUM:
+    case SPARC_G6_REGNUM:
+    case SPARC_G7_REGNUM:
+      reg->how = DWARF2_FRAME_REG_UNDEFINED;
+      break;
     case SPARC_SP_REGNUM:
       reg->how = DWARF2_FRAME_REG_CFA;
       break;
--- ./Makefile.in.~1~	2006-04-05 15:55:07.000000000 -0700
+++ ./Makefile.in	2006-04-05 16:50:56.000000000 -0700
@@ -2616,8 +2616,9 @@ sparc64-linux-nat.o: sparc64-linux-nat.c
 	$(gregset_h) $(sparc64_tdep_h) $(sparc_tdep_h) \
 	$(sparc_nat_h) $(inferior_h) $(target_h) $(linux_nat_h)
 sparc64-linux-tdep.o: sparc64-linux-tdep.c $(defs_h) $(frame_h) \
-	$(frame_unwind_h) $(gdbarch_h) $(osabi_h) $(solib_svr4_h) \
-	$(symtab_h) $(trad_frame_h) $(tramp_frame_h) $(sparc64_tdep_h)
+	$(frame_unwind_h) $(dwarf2_frame_h) $(gdbarch_h) $(osabi_h) \
+	$(solib_svr4_h) $(symtab_h) $(trad_frame_h) $(tramp_frame_h) \
+	$(sparc64_tdep_h)
 sparc64-nat.o: sparc64-nat.c $(defs_h) $(gdbarch_h) $(sparc64_tdep_h) \
 	$(sparc_nat_h)
 sparc64nbsd-nat.o: sparc64nbsd-nat.c $(defs_h) $(regcache_h) $(target_h) \



More information about the Gdb-patches mailing list