From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24403 invoked by alias); 6 Apr 2006 00:16:34 -0000 Received: (qmail 24385 invoked by uid 22791); 6 Apr 2006 00:16:33 -0000 X-Spam-Check-By: sourceware.org Received: from dsl027-180-168.sfo1.dsl.speakeasy.net (HELO sunset.davemloft.net) (216.27.180.168) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 06 Apr 2006 00:16:30 +0000 Received: from localhost ([127.0.0.1] ident=davem) by sunset.davemloft.net with esmtp (Exim 4.60) (envelope-from ) id 1FRIAS-00084u-PN for gdb-patches@sources.redhat.com; Wed, 05 Apr 2006 17:16:08 -0700 Date: Thu, 06 Apr 2006 00:16:00 -0000 Message-Id: <20060405.171555.27430870.davem@davemloft.net> To: gdb-patches@sources.redhat.com Subject: [PATCH]: Get dwarf2 working on sparc64 too. From: "David S. Miller" Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2006-04/txt/msg00065.txt.bz2 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 * 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) \