From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21848 invoked by alias); 28 May 2006 06:42:42 -0000 Received: (qmail 21831 invoked by uid 22791); 28 May 2006 06:42:41 -0000 X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sun, 28 May 2006 06:42:38 +0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11.20060308/8.12.11) with ESMTP id k4S5tYNX003711 for ; Sun, 28 May 2006 01:55:34 -0400 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.12.11.20060308/8.12.11) with ESMTP id k4S5tYW9002079; Sun, 28 May 2006 01:55:34 -0400 Received: from free.oliva.athome.lsd.ic.unicamp.br (vpn50-7.rdu.redhat.com [172.16.50.7]) by pobox.corp.redhat.com (8.12.8/8.12.8) with ESMTP id k4S5tXWA007850; Sun, 28 May 2006 01:55:33 -0400 Received: from free.oliva.athome.lsd.ic.unicamp.br (free.oliva.athome.lsd.ic.unicamp.br [127.0.0.1]) by free.oliva.athome.lsd.ic.unicamp.br (8.13.6/8.13.5) with ESMTP id k4S5tV22020682; Sun, 28 May 2006 02:55:32 -0300 Received: (from aoliva@localhost) by free.oliva.athome.lsd.ic.unicamp.br (8.13.6/8.13.5/Submit) id k4S5tU91020676; Sun, 28 May 2006 02:55:30 -0300 To: Mark Kettenis Cc: gdb-patches@sources.redhat.com, roland@redhat.com Subject: Re: Support Dwarf3 DW_CFA_val_* expressions References: <200603041017.k24AHjh7024812@elgar.sibelius.xs4all.nl> <20060304145755.GB20187@nevyn.them.org> <200603070838.k278cSMx005401@elgar.sibelius.xs4all.nl> <200603111139.k2BBdbsG011027@elgar.sibelius.xs4all.nl> From: Alexandre Oliva Date: Sun, 28 May 2006 22:22:00 -0000 In-Reply-To: <200603111139.k2BBdbsG011027@elgar.sibelius.xs4all.nl> (Mark Kettenis's message of "Sat, 11 Mar 2006 12:39:37 +0100 (CET)") Message-ID: User-Agent: Gnus/5.1007 (Gnus v5.10.7) XEmacs/21.5-b27 (linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" 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-05/txt/msg00468.txt.bz2 --=-=-= Content-length: 271 On Mar 11, 2006, Mark Kettenis wrote: > Anyway, feel free to commit the code that adds support for the new > DWARF3 expressions (the origional one, not the "corrected" one ;). Thanks, and sorry about the delay. I'm finally checking this in. --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=gdb-cfaval-3.patch Content-length: 3531 for gdb/ChangeLog from Alexandre Oliva * dwarf2-frame.h (enum dwarf2_frame_reg_rule): Add DWARF2_FRAME_REG_SAVED_VAL_OFFSET and DWARF2_FRAME_REG_SAVED_VAL_EXP. * dwarf2-frame.c (execute_cfa_program): Handle val_offset, val_offset_sf and val_expression. (dwarf2_frame_prev_register): Handle the new reg rules. (dwarf2_frame_this_id): Use pc instead of function entry point. Index: gdb/dwarf2-frame.c =================================================================== --- gdb/dwarf2-frame.c.orig 2006-05-28 02:44:41.000000000 -0300 +++ gdb/dwarf2-frame.c 2006-05-28 02:44:47.000000000 -0300 @@ -481,6 +481,34 @@ bad CFI data; mismatched DW_CFA_restore_ fs->regs.reg[reg].loc.offset = offset; break; + case DW_CFA_val_offset: + insn_ptr = read_uleb128 (insn_ptr, insn_end, ®); + dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); + insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp); + offset = utmp * fs->data_align; + fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_VAL_OFFSET; + fs->regs.reg[reg].loc.offset = offset; + break; + + case DW_CFA_val_offset_sf: + insn_ptr = read_uleb128 (insn_ptr, insn_end, ®); + dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); + insn_ptr = read_sleb128 (insn_ptr, insn_end, &offset); + offset *= fs->data_align; + fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_VAL_OFFSET; + fs->regs.reg[reg].loc.offset = offset; + break; + + case DW_CFA_val_expression: + insn_ptr = read_uleb128 (insn_ptr, insn_end, ®); + dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); + insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp); + fs->regs.reg[reg].loc.exp = insn_ptr; + fs->regs.reg[reg].exp_len = utmp; + fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_VAL_EXP; + insn_ptr += utmp; + break; + case DW_CFA_def_cfa_sf: insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->cfa_reg); if (eh_frame_p) @@ -965,6 +993,28 @@ dwarf2_frame_prev_register (struct frame } break; + case DWARF2_FRAME_REG_SAVED_VAL_OFFSET: + *optimizedp = 0; + *lvalp = not_lval; + *addrp = 0; + *realnump = -1; + if (valuep) + store_unsigned_integer (valuep, register_size (gdbarch, regnum), + cache->cfa + cache->reg[regnum].loc.offset); + break; + + case DWARF2_FRAME_REG_SAVED_VAL_EXP: + *optimizedp = 0; + *lvalp = not_lval; + *addrp = 0; + *realnump = -1; + if (valuep) + store_unsigned_integer (valuep, register_size (gdbarch, regnum), + execute_stack_op (cache->reg[regnum].loc.exp, + cache->reg[regnum].exp_len, + next_frame, cache->cfa)); + break; + case DWARF2_FRAME_REG_UNSPECIFIED: /* GCC, in its infinite wisdom decided to not provide unwind information for registers that are "same value". Since Index: gdb/dwarf2-frame.h =================================================================== --- gdb/dwarf2-frame.h.orig 2006-05-28 02:00:31.000000000 -0300 +++ gdb/dwarf2-frame.h 2006-05-28 02:44:47.000000000 -0300 @@ -51,6 +51,10 @@ enum dwarf2_frame_reg_rule DWARF2_FRAME_REG_SAVED_EXP, DWARF2_FRAME_REG_SAME_VALUE, + /* These are defined in Dwarf3. */ + DWARF2_FRAME_REG_SAVED_VAL_OFFSET, + DWARF2_FRAME_REG_SAVED_VAL_EXP, + /* These aren't defined by the DWARF2 CFI specification, but are used internally by GDB. */ DWARF2_FRAME_REG_RA, /* Return Address. */ --=-=-= Content-length: 249 -- Alexandre Oliva http://www.lsd.ic.unicamp.br/~oliva/ Secretary for FSF Latin America http://www.fsfla.org/ Red Hat Compiler Engineer aoliva@{redhat.com, gcc.gnu.org} Free Software Evangelist oliva@{lsd.ic.unicamp.br, gnu.org} --=-=-=--