From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30225 invoked by alias); 3 Apr 2003 21:52:13 -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 30216 invoked from network); 3 Apr 2003 21:52:13 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 3 Apr 2003 21:52:13 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id h33LqCe15600 for ; Thu, 3 Apr 2003 16:52:13 -0500 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h33LqCJ18132 for ; Thu, 3 Apr 2003 16:52:12 -0500 Received: from localhost.redhat.com (romulus-int.sfbay.redhat.com [172.16.27.46]) by pobox.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h33LqB319111 for ; Thu, 3 Apr 2003 16:52:11 -0500 Received: by localhost.redhat.com (Postfix, from userid 469) id 3C9692C441; Thu, 3 Apr 2003 16:56:53 -0500 (EST) From: Elena Zannoni MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16012.44581.79737.640727@localhost.redhat.com> Date: Thu, 03 Apr 2003 21:52:00 -0000 To: Daniel Jacobowitz Cc: gdb-patches@sources.redhat.com Subject: Re: RFA/dwarf: Fix the GCC 2.95.3 store.exp regression for multi-register variables In-Reply-To: <20030312204053.GA31861@nevyn.them.org> References: <20030312204053.GA31861@nevyn.them.org> X-SW-Source: 2003-04/txt/msg00059.txt.bz2 Daniel Jacobowitz writes: > This kills both a hack and the regression discussed on gdb@. Instead of > returning the value of the register and the register number, if the > expression evaluator only returns the register number, we can use > value_from_register. This way we share multi-register variable handling > with the non-LOC_COMPUTED case. > > This patch removes a FIXME and an interface I didn't much like (the lval > argument to dwarf_expr_read_reg) so I'm pretty happy with it. Everything > should go back to working that worked before. > > Is this OK? > Dan, seems good. Expecially since it simplifies some code. No other regressions, right? :-) elena > -- > Daniel Jacobowitz > MontaVista Software Debian GNU/Linux Developer > > 2003-03-12 Daniel Jacobowitz > > * dwarf2expr.h (struct dwarf_expr_context): Remove extra arguments > to read_reg and update its comment. Remove regnum member. > * dwarf2expr.c (execute_stack_op): Remove memaddr and expr_lval. > Don't call read_reg when setting in_reg. Call read_reg to get > the frame base if it's in a register. Return the register number > on the stack instead of in the context. Remove extra arguments > to read_reg. > * dwarf2loc.c (dwarf_expr_read_reg): Remove extra arguments. > (dwarf2_evaluate_loc_desc): Call value_from_register. Expect > the register number on the expression stack. > (needs_frame_read_reg): Remove extra arguments. > > Index: dwarf2expr.c > =================================================================== > RCS file: /big/fsf/rsync/src-cvs/src/gdb/dwarf2expr.c,v > retrieving revision 1.3 > diff -u -p -r1.3 dwarf2expr.c > --- dwarf2expr.c 5 Mar 2003 18:00:02 -0000 1.3 > +++ dwarf2expr.c 12 Mar 2003 20:31:06 -0000 > @@ -231,11 +231,10 @@ execute_stack_op (struct dwarf_expr_cont > while (op_ptr < op_end) > { > enum dwarf_location_atom op = *op_ptr++; > - CORE_ADDR result, memaddr; > + CORE_ADDR result; > ULONGEST uoffset, reg; > LONGEST offset; > int bytes_read; > - enum lval_type expr_lval; > > ctx->in_reg = 0; > > @@ -361,19 +360,8 @@ execute_stack_op (struct dwarf_expr_cont > error ("DWARF-2 expression error: DW_OP_reg operations must be " > "used alone."); > > - /* FIXME drow/2003-02-21: This call to read_reg could be pushed > - into the evaluator's caller by changing the semantics for in_reg. > - Then we wouldn't need to return an lval_type and a memaddr. */ > - result = (ctx->read_reg) (ctx->baton, op - DW_OP_reg0, &expr_lval, > - &memaddr); > - > - if (expr_lval == lval_register) > - { > - ctx->regnum = op - DW_OP_reg0; > - ctx->in_reg = 1; > - } > - else > - result = memaddr; > + result = op - DW_OP_reg0; > + ctx->in_reg = 1; > > break; > > @@ -383,16 +371,8 @@ execute_stack_op (struct dwarf_expr_cont > error ("DWARF-2 expression error: DW_OP_reg operations must be " > "used alone."); > > - result = (ctx->read_reg) (ctx->baton, reg, &expr_lval, &memaddr); > - > - if (expr_lval == lval_register) > - { > - ctx->regnum = reg; > - ctx->in_reg = 1; > - } > - else > - result = memaddr; > - > + result = reg; > + ctx->in_reg = 1; > break; > > case DW_OP_breg0: > @@ -429,8 +409,7 @@ execute_stack_op (struct dwarf_expr_cont > case DW_OP_breg31: > { > op_ptr = read_sleb128 (op_ptr, op_end, &offset); > - result = (ctx->read_reg) (ctx->baton, op - DW_OP_breg0, > - &expr_lval, &memaddr); > + result = (ctx->read_reg) (ctx->baton, op - DW_OP_breg0); > result += offset; > } > break; > @@ -438,7 +417,7 @@ execute_stack_op (struct dwarf_expr_cont > { > op_ptr = read_uleb128 (op_ptr, op_end, ®); > op_ptr = read_sleb128 (op_ptr, op_end, &offset); > - result = (ctx->read_reg) (ctx->baton, reg, &expr_lval, &memaddr); > + result = (ctx->read_reg) (ctx->baton, reg); > result += offset; > } > break; > @@ -457,7 +436,9 @@ execute_stack_op (struct dwarf_expr_cont > (ctx->get_frame_base) (ctx->baton, &datastart, &datalen); > dwarf_expr_eval (ctx, datastart, datalen); > result = dwarf_expr_fetch (ctx, 0); > - if (! ctx->in_reg) > + if (ctx->in_reg) > + result = (ctx->read_reg) (ctx->baton, result); > + else > { > char *buf = alloca (TARGET_ADDR_BIT / TARGET_CHAR_BIT); > int bytes_read; > Index: dwarf2expr.h > =================================================================== > RCS file: /big/fsf/rsync/src-cvs/src/gdb/dwarf2expr.h,v > retrieving revision 1.2 > diff -u -p -r1.2 dwarf2expr.h > --- dwarf2expr.h 28 Feb 2003 20:03:18 -0000 1.2 > +++ dwarf2expr.h 12 Mar 2003 20:31:38 -0000 > @@ -36,13 +36,8 @@ struct dwarf_expr_context > to all of the callback functions. */ > void *baton; > > - /* Return the value of register number REGNUM. LVALP will be set > - to the kind of lval this register is (generally lval_register > - for the current frame's registers or lval_memory for a register > - saved to the stack). For lval_memory ADDRP will be set to the > - saved location of the register. */ > - CORE_ADDR (*read_reg) (void *baton, int regnum, enum lval_type *lvalp, > - CORE_ADDR *addrp); > + /* Return the value of register number REGNUM. */ > + CORE_ADDR (*read_reg) (void *baton, int regnum); > > /* Read LENGTH bytes at ADDR into BUF. */ > void (*read_mem) (void *baton, char *buf, CORE_ADDR addr, > @@ -77,12 +72,8 @@ struct dwarf_expr_context > int recursion_depth, max_recursion_depth; > > /* Non-zero if the result is in a register. The register number > - will be in REGNUM, and the result will be the contents of the > - register. */ > + will be on the expression stack. */ > int in_reg; > - > - /* If the result is in a register, the register number. */ > - int regnum; > }; > > struct dwarf_expr_context *new_dwarf_expr_context (); > Index: dwarf2loc.c > =================================================================== > RCS file: /big/fsf/rsync/src-cvs/src/gdb/dwarf2loc.c,v > retrieving revision 1.3 > diff -u -p -r1.3 dwarf2loc.c > --- dwarf2loc.c 5 Mar 2003 18:00:02 -0000 1.3 > +++ dwarf2loc.c 12 Mar 2003 20:33:59 -0000 > @@ -54,11 +54,11 @@ struct dwarf_expr_baton > type will be returned in LVALP, and for lval_memory the register > save address will be returned in ADDRP. */ > static CORE_ADDR > -dwarf_expr_read_reg (void *baton, int dwarf_regnum, enum lval_type *lvalp, > - CORE_ADDR *addrp) > +dwarf_expr_read_reg (void *baton, int dwarf_regnum) > { > struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton; > - CORE_ADDR result; > + CORE_ADDR result, save_addr; > + enum lval_type lval_type; > char *buf; > int optimized, regnum, realnum, regsize; > > @@ -66,8 +66,8 @@ dwarf_expr_read_reg (void *baton, int dw > regsize = register_size (current_gdbarch, regnum); > buf = (char *) alloca (regsize); > > - frame_register (debaton->frame, regnum, &optimized, lvalp, addrp, &realnum, > - buf); > + frame_register (debaton->frame, regnum, &optimized, &lval_type, &save_addr, > + &realnum, buf); > result = extract_address (buf, regsize); > > return result; > @@ -138,21 +138,15 @@ dwarf2_evaluate_loc_desc (struct symbol > ctx->get_tls_address = dwarf_expr_tls_address; > > dwarf_expr_eval (ctx, data, size); > - > - retval = allocate_value (SYMBOL_TYPE (var)); > - VALUE_BFD_SECTION (retval) = SYMBOL_BFD_SECTION (var); > + result = dwarf_expr_fetch (ctx, 0); > > if (ctx->in_reg) > - { > - store_unsigned_integer (VALUE_CONTENTS_RAW (retval), > - TYPE_LENGTH (SYMBOL_TYPE (var)), > - dwarf_expr_fetch (ctx, 0)); > - VALUE_LVAL (retval) = lval_register; > - VALUE_REGNO (retval) = ctx->regnum; > - } > + retval = value_from_register (SYMBOL_TYPE (var), result, frame); > else > { > - result = dwarf_expr_fetch (ctx, 0); > + retval = allocate_value (SYMBOL_TYPE (var)); > + VALUE_BFD_SECTION (retval) = SYMBOL_BFD_SECTION (var); > + > VALUE_LVAL (retval) = lval_memory; > VALUE_LAZY (retval) = 1; > VALUE_ADDRESS (retval) = result; > @@ -176,8 +170,7 @@ struct needs_frame_baton > > /* Reads from registers do require a frame. */ > static CORE_ADDR > -needs_frame_read_reg (void *baton, int regnum, enum lval_type *lvalp, > - CORE_ADDR *addrp) > +needs_frame_read_reg (void *baton, int regnum) > { > struct needs_frame_baton *nf_baton = baton; > nf_baton->needs_frame = 1;