From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29389 invoked by alias); 18 Feb 2004 16:45:23 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 29341 invoked from network); 18 Feb 2004 16:45:19 -0000 Received: from unknown (HELO faui10.informatik.uni-erlangen.de) (131.188.31.10) by sources.redhat.com with SMTP; 18 Feb 2004 16:45:19 -0000 Received: from faui1d.informatik.uni-erlangen.de (faui1d [131.188.31.34]) by faui10.informatik.uni-erlangen.de (8.9.3p3/8.1.9-FAU) with ESMTP id RAA29932 for ; Wed, 18 Feb 2004 17:45:13 +0100 (CET) From: Ulrich Weigand Received: (from weigand@localhost) by faui1d.informatik.uni-erlangen.de (8.9.3p3/8.1.6-FAU) id RAA19463 for gdb-patches@sources.redhat.com; Wed, 18 Feb 2004 17:45:13 +0100 (CET) Message-Id: <200402181645.RAA19463@faui1d.informatik.uni-erlangen.de> Subject: [PATCH] Enable DWARF-2 frames on S/390 To: gdb-patches@sources.redhat.com Date: Wed, 18 Feb 2004 16:45:00 -0000 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-SW-Source: 2004-02/txt/msg00515.txt.bz2 Hello, now that all pieces of the DWARF-2 CFI rework have gone in, and the big s390 backend reorganization was also committed, this patch is the only thing that's missing to enable DWARF-2 frame support on s390. Do you think a copyright assignment is required for this? While it's longer than 10 lines, it doesn't really contain anything that should be significant w.r.t. intellectual property -- the s390_dwarf2_frame_init_reg routine only implements the publicly documented s390 ABI calling convention ... Tested on s390-ibm-linux and s390x-ibm-linux. Bye, Ulrich ChangeLog: * s390-tdep.c: Include "dwarf2-frame.h". (s390_dwarf2_frame_init_reg): New function. (s390_gdbarch_init): Install dwarf2_frame_sniffer and dwarf2_frame_base_sniffer. Call dwarf2_frame_set_init_reg. * Makefile.in (s390-tdep.o): Update dependencies. diff -c -p -r gdb-head/gdb/Makefile.in gdb-head-new/gdb/Makefile.in *** gdb-head/gdb/Makefile.in Wed Feb 18 05:17:34 2004 --- gdb-head-new/gdb/Makefile.in Wed Feb 18 16:27:02 2004 *************** s390-nat.o: s390-nat.c $(defs_h) $(tm_h) *** 2181,2187 **** s390-tdep.o: s390-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) $(inferior_h) \ $(symtab_h) $(target_h) $(gdbcore_h) $(gdbcmd_h) $(symfile_h) \ $(objfiles_h) $(tm_h) $(__bfd_bfd_h) $(floatformat_h) $(regcache_h) \ ! $(trad_frame_h) $(frame_base_h) $(frame_unwind_h) \ $(reggroups_h) $(regset_h) $(value_h) $(gdb_assert_h) $(dis_asm_h) \ $(solib_svr4_h) $(s390_tdep_h) scm-exp.o: scm-exp.c $(defs_h) $(symtab_h) $(gdbtypes_h) $(expression_h) \ --- 2181,2187 ---- s390-tdep.o: s390-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) $(inferior_h) \ $(symtab_h) $(target_h) $(gdbcore_h) $(gdbcmd_h) $(symfile_h) \ $(objfiles_h) $(tm_h) $(__bfd_bfd_h) $(floatformat_h) $(regcache_h) \ ! $(trad_frame_h) $(frame_base_h) $(frame_unwind_h) $(dwarf2_frame_h) \ $(reggroups_h) $(regset_h) $(value_h) $(gdb_assert_h) $(dis_asm_h) \ $(solib_svr4_h) $(s390_tdep_h) scm-exp.o: scm-exp.c $(defs_h) $(symtab_h) $(gdbtypes_h) $(expression_h) \ diff -c -p -r gdb-head/gdb/s390-tdep.c gdb-head-new/gdb/s390-tdep.c *** gdb-head/gdb/s390-tdep.c Wed Feb 18 05:17:35 2004 --- gdb-head-new/gdb/s390-tdep.c Wed Feb 18 16:22:46 2004 *************** *** 38,43 **** --- 38,44 ---- #include "trad-frame.h" #include "frame-base.h" #include "frame-unwind.h" + #include "dwarf2-frame.h" #include "reggroups.h" #include "regset.h" #include "value.h" *************** s390_unwind_sp (struct gdbarch *gdbarch, *** 2298,2303 **** --- 2299,2351 ---- } + /* DWARF-2 frame support. */ + + static void + s390_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum, + struct dwarf2_frame_state_reg *reg) + { + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + switch (tdep->abi) + { + case ABI_LINUX_S390: + /* Call-saved registers. */ + if ((regnum >= S390_R6_REGNUM && regnum <= S390_R15_REGNUM) + || regnum == S390_F4_REGNUM + || regnum == S390_F6_REGNUM) + reg->how = DWARF2_FRAME_REG_SAME_VALUE; + + /* Call-clobbered registers. */ + else if ((regnum >= S390_R0_REGNUM && regnum <= S390_R5_REGNUM) + || (regnum >= S390_F0_REGNUM && regnum <= S390_F15_REGNUM + && regnum != S390_F4_REGNUM && regnum != S390_F6_REGNUM)) + reg->how = DWARF2_FRAME_REG_UNDEFINED; + + /* The return address column. */ + else if (regnum == S390_PC_REGNUM) + reg->how = DWARF2_FRAME_REG_RA; + break; + + case ABI_LINUX_ZSERIES: + /* Call-saved registers. */ + if ((regnum >= S390_R6_REGNUM && regnum <= S390_R15_REGNUM) + || (regnum >= S390_F8_REGNUM && regnum <= S390_F15_REGNUM)) + reg->how = DWARF2_FRAME_REG_SAME_VALUE; + + /* Call-clobbered registers. */ + else if ((regnum >= S390_R0_REGNUM && regnum <= S390_R5_REGNUM) + || (regnum >= S390_F0_REGNUM && regnum <= S390_F7_REGNUM)) + reg->how = DWARF2_FRAME_REG_UNDEFINED; + + /* The return address column. */ + else if (regnum == S390_PC_REGNUM) + reg->how = DWARF2_FRAME_REG_RA; + break; + } + } + + /* Dummy function calls. */ /* Return non-zero if TYPE is an integer-like type, zero otherwise. *************** s390_gdbarch_init (struct gdbarch_info i *** 2977,2982 **** --- 3025,3033 ---- /* Frame handling. */ set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section); + dwarf2_frame_set_init_reg (gdbarch, s390_dwarf2_frame_init_reg); + frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer); + frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer); frame_unwind_append_sniffer (gdbarch, s390_pltstub_frame_sniffer); frame_unwind_append_sniffer (gdbarch, s390_sigtramp_frame_sniffer); frame_unwind_append_sniffer (gdbarch, s390_frame_sniffer); -- Dr. Ulrich Weigand weigand@informatik.uni-erlangen.de