From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19119 invoked by alias); 2 Apr 2005 22:18:55 -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 19075 invoked from network); 2 Apr 2005 22:18:47 -0000 Received: from unknown (HELO sibelius.xs4all.nl) (82.92.89.47) by sourceware.org with SMTP; 2 Apr 2005 22:18:47 -0000 Received: from elgar.sibelius.xs4all.nl (root@elgar.sibelius.xs4all.nl [192.168.0.2]) by sibelius.xs4all.nl (8.13.0/8.13.0) with ESMTP id j32MIgLV023298 for ; Sun, 3 Apr 2005 00:18:42 +0200 (CEST) Received: from elgar.sibelius.xs4all.nl (kettenis@localhost.sibelius.xs4all.nl [127.0.0.1]) by elgar.sibelius.xs4all.nl (8.13.3/8.13.3) with ESMTP id j32MIgJg001290 for ; Sun, 3 Apr 2005 00:18:42 +0200 (CEST) Received: (from kettenis@localhost) by elgar.sibelius.xs4all.nl (8.13.3/8.13.3/Submit) id j32MIgoQ032738; Sun, 3 Apr 2005 00:18:42 +0200 (CEST) Date: Sat, 02 Apr 2005 22:18:00 -0000 Message-Id: <200504022218.j32MIgoQ032738@elgar.sibelius.xs4all.nl> From: Mark Kettenis To: gdb-patches@sourceware.org Subject: [RFC] Teach dwarf2-frame.c about StackGhost X-SW-Source: 2005-04/txt/msg00028.txt.bz2 One of the things that still keeps me from enabling the DWARF2 unwinder on SPARC is the fact that it doesn't play nice with StackGhost. Here is an attempt to make dwarf2-frame.c deal with it by introducing yet another register rule. People might object since this is only sort of architecture independent code. However it seems that this is the cleanest way to solve this. If there's no opposition, I'll check this in next weekend. Mark Index: ChangeLog from Mark Kettenis * dwarf2-frame.h (enum dwarf2_frame_reg_rule): Add DWARF2_FRAME_REG_SAVED_WCOOKIE. * dwarf2-frame.c: Include "target.h". (execute_cfa_program): Handle StackGhost. (dwarf2_frame_prev_register): Likewise. * Makefile.in (dwarf2-frame.o): Update dependencies. Index: dwarf2-frame.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2-frame.c,v retrieving revision 1.50 diff -u -p -r1.50 dwarf2-frame.c --- dwarf2-frame.c 26 Mar 2005 15:20:42 -0000 1.50 +++ dwarf2-frame.c 2 Apr 2005 22:14:29 -0000 @@ -32,6 +32,7 @@ #include "symtab.h" #include "objfiles.h" #include "regcache.h" +#include "target.h" #include "gdb_assert.h" #include "gdb_string.h" @@ -462,11 +463,14 @@ bad CFI data; mismatched DW_CFA_restore_ fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_REG; fs->regs.reg[reg].loc.reg = reg + 16; } - for (reg = 16; reg < 32; reg++) + for (reg = 16; reg < 31; reg++) { fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_OFFSET; fs->regs.reg[reg].loc.offset = (reg - 16) * size; } + /* We may have to apply a StackGhost cookie. */ + fs->regs.reg[31].how = DWARF2_FRAME_REG_SAVED_WCOOKIE; + fs->regs.reg[31].loc.offset = 15 * size; } break; @@ -836,6 +840,7 @@ dwarf2_frame_prev_register (struct frame break; case DWARF2_FRAME_REG_SAVED_OFFSET: + case DWARF2_FRAME_REG_SAVED_WCOOKIE: *optimizedp = 0; *lvalp = lval_memory; *addrp = cache->cfa + cache->reg[regnum].loc.offset; @@ -915,6 +920,7 @@ dwarf2_frame_prev_register (struct frame if (valuep) { CORE_ADDR pc = cache->reg[regnum].loc.offset; + int regnum; regnum = DWARF2_REG_TO_REGNUM (cache->retaddr_reg.loc.reg); pc += frame_unwind_register_unsigned (next_frame, regnum); @@ -925,6 +931,32 @@ dwarf2_frame_prev_register (struct frame default: internal_error (__FILE__, __LINE__, _("Unknown register rule.")); } + + /* Handle StackGhost. */ + if (cache->reg[regnum].how == DWARF2_FRAME_REG_SAVED_WCOOKIE) + { + int size = register_size (gdbarch, regnum); + struct target_ops *ops = ¤t_target; + char *buf = alloca (size); + int len; + + len = target_read_partial (ops, TARGET_OBJECT_WCOOKIE, NULL, + buf, 0, size); + if (len != -1) + { + ULONGEST wcookie = extract_unsigned_integer (buf, len); + + gdb_assert (len == size); + + *lvalp = not_lval; + *addrp = 0; + if (valuep) + { + ULONGEST value = extract_unsigned_integer (valuep, size); + store_unsigned_integer (valuep, size, value ^ wcookie); + } + } + } } static const struct frame_unwind dwarf2_frame_unwind = Index: dwarf2-frame.h =================================================================== RCS file: /cvs/src/src/gdb/dwarf2-frame.h,v retrieving revision 1.8 diff -u -p -r1.8 dwarf2-frame.h --- dwarf2-frame.h 25 Mar 2005 16:51:40 -0000 1.8 +++ dwarf2-frame.h 2 Apr 2005 22:14:29 -0000 @@ -55,7 +55,9 @@ enum dwarf2_frame_reg_rule used internally by GDB. */ DWARF2_FRAME_REG_RA, /* Return Address. */ DWARF2_FRAME_REG_RA_OFFSET, /* Return Address with offset. */ - DWARF2_FRAME_REG_CFA /* Call Frame Address. */ + DWARF2_FRAME_REG_CFA, /* Call Frame Address. */ + DWARF2_FRAME_REG_SAVED_WCOOKIE/* Like DWARF2_FRAME_SAVED_OFFSET, but + apply StackGhost cookie. */ }; /* Register state. */ Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.710 diff -u -p -r1.710 Makefile.in --- Makefile.in 31 Mar 2005 19:58:24 -0000 1.710 +++ Makefile.in 2 Apr 2005 22:14:31 -0000 @@ -1887,7 +1887,7 @@ dwarf2expr.o: dwarf2expr.c $(defs_h) $(s $(gdbcore_h) $(elf_dwarf2_h) $(dwarf2expr_h) dwarf2-frame.o: dwarf2-frame.c $(defs_h) $(dwarf2expr_h) $(elf_dwarf2_h) \ $(frame_h) $(frame_base_h) $(frame_unwind_h) $(gdbcore_h) \ - $(gdbtypes_h) $(symtab_h) $(objfiles_h) $(regcache_h) \ + $(gdbtypes_h) $(symtab_h) $(objfiles_h) $(regcache_h) $(target_h) \ $(gdb_assert_h) $(gdb_string_h) $(complaints_h) $(dwarf2_frame_h) dwarf2loc.o: dwarf2loc.c $(defs_h) $(ui_out_h) $(value_h) $(frame_h) \ $(gdbcore_h) $(target_h) $(inferior_h) $(ax_h) $(ax_gdb_h) \