From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31219 invoked by alias); 9 Jul 2002 21:00:37 -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 31208 invoked from network); 9 Jul 2002 21:00:36 -0000 Received: from unknown (HELO zwingli.cygnus.com) (208.245.165.35) by sources.redhat.com with SMTP; 9 Jul 2002 21:00:36 -0000 Received: by zwingli.cygnus.com (Postfix, from userid 442) id F2A745EA11; Tue, 9 Jul 2002 16:00:34 -0500 (EST) To: Daniel Berlin Cc: gdb-patches@sources.redhat.com Subject: Re: [RFA]: LOC_COMPUTED + abstracted dwarf2 evaluator, again References: From: Jim Blandy Date: Tue, 09 Jul 2002 14:03:00 -0000 In-Reply-To: Message-ID: User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.1 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2002-07/txt/msg00159.txt.bz2 Daniel Berlin writes: > + /* Evaluate a location description, given in THEBLOCK, in the > + context of frame FRAME. */ > + static struct value * > + evaluate_loc_desc (struct symbol *var, struct frame_info *frame, > + struct dwarf_block *theblock, struct type *type) > + { > + CORE_ADDR result; > + struct value * retval; > + struct dwarf_expr_baton *baton = xmalloc (sizeof (struct dwarf_expr_baton)); > + struct dwarf_expr_context *ctx; > + > + retval = allocate_value(type); > + baton->var = var; > + baton->frame = frame; > + > + VALUE_LVAL (retval) = lval_memory; > + VALUE_BFD_SECTION (retval) = SYMBOL_BFD_SECTION (var); > + > + ctx = new_dwarf_expr_context (); > + ctx->read_reg_baton = baton; > + ctx->read_reg = dwarf_expr_read_reg; > + ctx->read_mem_baton = baton; > + ctx->read_mem = dwarf_expr_read_mem; > + ctx->get_frame_base_baton = baton; > + ctx->get_frame_base = dwarf_expr_frame_base; > + ctx->error = error; > + > + dwarf_expr_eval (ctx, theblock->data, theblock->size); > + > + if (ctx->in_reg) > + { > + store_typed_address (VALUE_CONTENTS_RAW (retval), > + SYMBOL_TYPE (var), dwarf_expr_fetch (ctx, 0)); > + VALUE_LVAL (retval) = not_lval; > + } > + else > + { > + result = dwarf_expr_fetch (ctx, 0); > + VALUE_LAZY (retval) = 1; > + VALUE_ADDRESS (retval) = result; > + } This looks wrong. If evaluating the Dwarf location expression yields an `in_reg' result, shouldn't the value be an lval_register, with its the address set to the register number? I think the evaluator is confused in this regard, too; see my upcoming post about that.