From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30503 invoked by alias); 25 Nov 2016 10:07:05 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 30240 invoked by uid 89); 25 Nov 2016 10:07:04 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=ham version=3.3.2 spammy=misuse, internal_error, gdb_byte, sk:gdbarch X-HELO: mail-pf0-f196.google.com Received: from mail-pf0-f196.google.com (HELO mail-pf0-f196.google.com) (209.85.192.196) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 25 Nov 2016 10:06:54 +0000 Received: by mail-pf0-f196.google.com with SMTP id y68so2856727pfb.1 for ; Fri, 25 Nov 2016 02:06:54 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=FDrS5xATU42hvuoGMUgF17kbhJZRocc3NNFUoV65ceA=; b=LkBFxayZxupENwUql9RV5nSQzq/isFRflnrSWSQ0XywaHtz39gHnTG40I57XxAzZaV Yh8YeoagwcgzSr1rVf0HUwU1sO7Cui3846vqNdp5wsydb8dh+/YbgdFGh7asY5FJ2ERK DJMQVDnSETyzMcUwtCZmJNzCEU6UAv0UhSvYNXP1Ul0BH5kbNrZWAmoHfefYTU+mZsme iosdbpnTnsUNNSewF0Ro32VrIfjiBrwW7CKkMDjvPeJ+p3wzpI8fjFLIWjjb+dZLKPM+ YIlEdlUsedb19EDdA+fPNKedMCj4EAiaI558Om45GzANkxerSsoMgLjJT4dsNS/Mdequ R8Yw== X-Gm-Message-State: AKaTC03sczSZXblTNe8yjNE2dzUCDfUhsBY29Aw5NPMOXgzUB2nzj/4cpXFYcnzgamrSEA== X-Received: by 10.99.246.83 with SMTP id u19mr12675078pgj.165.1480068412714; Fri, 25 Nov 2016 02:06:52 -0800 (PST) Received: from E107787-LIN.cambridge.arm.com (gcc1-power7.osuosl.org. [140.211.15.137]) by smtp.gmail.com with ESMTPSA id 13sm66563287pfz.30.2016.11.25.02.06.51 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 25 Nov 2016 02:06:52 -0800 (PST) From: Yao Qi X-Google-Original-From: Yao Qi To: gdb-patches@sourceware.org Subject: [PATCH 1/3] Move computed value's frame id to piece_closure Date: Fri, 25 Nov 2016 10:07:00 -0000 Message-Id: <1480068407-22616-2-git-send-email-yao.qi@linaro.org> In-Reply-To: <1480068407-22616-1-git-send-email-yao.qi@linaro.org> References: <20161123125000.DBC6D10FB47@oc8523832656.ibm.com> <1480068407-22616-1-git-send-email-yao.qi@linaro.org> X-IsSubscribed: yes X-SW-Source: 2016-11/txt/msg00795.txt.bz2 Nowadays, we set computed value's frame id, which is a misuse to me. The computed value itself doesn't care about frame id, but function value_computed_funcs (val)->read (or read_pieced_value) cares about which frame the register is relative to, so 'struct piece_closure' is a better place to fit frame id. This patch adds a frame id in 'struct piece_closure', and use it instead of using computed value's frame id. gdb: 2016-11-24 Yao Qi * dwarf2loc.c (struct piece_closure) : New field. (allocate_piece_closure): Add new parameter 'frame' and set closure's frame_id field accordingly. (read_pieced_value): Get frame from closure instead of value. (dwarf2_evaluate_loc_desc_full): Remove code getting frame id. Don't set value's frame id. --- gdb/dwarf2loc.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 44dceda..872d033 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -1464,6 +1464,10 @@ struct piece_closure /* The pieces themselves. */ struct dwarf_expr_piece *pieces; + + /* Frame ID of frame to which a register value is relative, used + only by DWARF_VALUE_REGISTER. */ + struct frame_id frame_id; }; /* Allocate a closure for a value formed from separately-described @@ -1472,7 +1476,7 @@ struct piece_closure static struct piece_closure * allocate_piece_closure (struct dwarf2_per_cu_data *per_cu, int n_pieces, struct dwarf_expr_piece *pieces, - int addr_size) + int addr_size, struct frame_info *frame) { struct piece_closure *c = XCNEW (struct piece_closure); int i; @@ -1482,6 +1486,10 @@ allocate_piece_closure (struct dwarf2_per_cu_data *per_cu, c->n_pieces = n_pieces; c->addr_size = addr_size; c->pieces = XCNEWVEC (struct dwarf_expr_piece, n_pieces); + if (frame == NULL) + c->frame_id = null_frame_id; + else + c->frame_id = get_frame_id (get_next_frame_sentinel_okay (frame)); memcpy (c->pieces, pieces, n_pieces * sizeof (struct dwarf_expr_piece)); for (i = 0; i < n_pieces; ++i) @@ -1672,18 +1680,12 @@ read_pieced_value (struct value *v) gdb_byte *contents; struct piece_closure *c = (struct piece_closure *) value_computed_closure (v); - struct frame_info *frame; size_t type_len; size_t buffer_size = 0; std::vector buffer; int bits_big_endian = gdbarch_bits_big_endian (get_type_arch (value_type (v))); - /* VALUE_FRAME_ID is used instead of VALUE_NEXT_FRAME_ID here - because FRAME is passed to get_frame_register_bytes(), which - does its own "->next" operation. */ - frame = frame_find_by_id (VALUE_FRAME_ID (v)); - if (value_type (v) != value_enclosing_type (v)) internal_error (__FILE__, __LINE__, _("Should not be able to create a lazy value with " @@ -1743,6 +1745,8 @@ read_pieced_value (struct value *v) { case DWARF_VALUE_REGISTER: { + struct frame_info *frame + = frame_find_by_id (get_prev_frame_id_by_id (c->frame_id)); struct gdbarch *arch = get_frame_arch (frame); int gdb_regnum = dwarf_reg_to_regnum_or_error (arch, p->v.regno); int optim, unavail; @@ -2311,10 +2315,6 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, if (ctx.num_pieces > 0) { struct piece_closure *c; - struct frame_id frame_id - = frame == NULL - ? null_frame_id - : get_frame_id (get_next_frame_sentinel_okay (frame)); ULONGEST bit_size = 0; int i; @@ -2324,12 +2324,11 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, invalid_synthetic_pointer (); c = allocate_piece_closure (per_cu, ctx.num_pieces, ctx.pieces, - ctx.addr_size); + ctx.addr_size, frame); /* We must clean up the value chain after creating the piece closure but before allocating the result. */ do_cleanups (value_chain); retval = allocate_computed_value (type, &pieced_value_funcs, c); - VALUE_NEXT_FRAME_ID (retval) = frame_id; set_value_offset (retval, byte_offset); } else -- 1.9.1