From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 91951 invoked by alias); 18 Nov 2015 16:40:15 -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 91854 invoked by uid 89); 18 Nov 2015 16:40:14 -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,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 18 Nov 2015 16:40:10 +0000 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 528A165670; Wed, 18 Nov 2015 16:40:09 +0000 (UTC) Received: from brno.lan (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id tAIGe2QB030267; Wed, 18 Nov 2015 11:40:08 -0500 From: Pedro Alves To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH 4/6] [C++] breakpoint.c: "no memory" software watchpoints and enum casts Date: Wed, 18 Nov 2015 16:40:00 -0000 Message-Id: <1447864802-24016-5-git-send-email-palves@redhat.com> In-Reply-To: <1447864802-24016-1-git-send-email-palves@redhat.com> References: <1447864802-24016-1-git-send-email-palves@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-SW-Source: 2015-11/txt/msg00367.txt.bz2 Fixes: src/gdb/breakpoint.c: In function ‘void update_watchpoint(watchpoint*, int)’: src/gdb/breakpoint.c:2147:31: error: invalid conversion from ‘int’ to ‘target_hw_bp_type’ [-fpermissive] base->loc->watchpoint_type = -1; ^ Seems better to rely on "address == -1 && length == -1" than on a enum value that's not really part of the set of supposedly valid enum values. Also, factor that out to separate functions for better localization of the concept. gdb/ChangeLog: 2015-11-18 Pedro Alves * breakpoint.c (software_watchpoint_add_memoryless_location) (is_memoryless_software_watchpoint): New functions. (update_watchpoint): Use software_watchpoint_add_memoryless_location. (breakpoint_address_bits): Use is_memoryless_software_watchpoint. --- gdb/breakpoint.c | 49 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 5863573..1425d2d 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1775,6 +1775,36 @@ extract_bitfield_from_watchpoint_value (struct watchpoint *w, struct value *val) return bit_val; } +/* Allocate a dummy location and add it to B, which must be a software + watchpoint. This is required because even if a software watchpoint + is not watching any memory, bpstat_stop_status requires a location + to be able to report stops. */ + +static void +software_watchpoint_add_no_memory_location (struct breakpoint *b, + struct program_space *pspace) +{ + gdb_assert (b->type == bp_watchpoint && b->loc == NULL); + + b->loc = allocate_bp_location (b); + b->loc->pspace = pspace; + b->loc->address = -1; + b->loc->length = -1; +} + +/* Returns true if B is a software watchpoint that is not watching any + memory (e.g., "watch $pc"). */ + +static int +is_no_memory_software_watchpoint (struct breakpoint *b) +{ + return (b->type == bp_watchpoint + && b->loc != NULL + && b->loc->next == NULL + && b->loc->address == -1 + && b->loc->length == -1); +} + /* Assuming that B is a watchpoint: - Reparse watchpoint expression, if REPARSE is non-zero - Evaluate expression and store the result in B->val @@ -2138,14 +2168,7 @@ update_watchpoint (struct watchpoint *b, int reparse) bpstat_stop_status requires a location to be able to report stops, so make sure there's at least a dummy one. */ if (b->base.type == bp_watchpoint && b->base.loc == NULL) - { - struct breakpoint *base = &b->base; - base->loc = allocate_bp_location (base); - base->loc->pspace = frame_pspace; - base->loc->address = -1; - base->loc->length = -1; - base->loc->watchpoint_type = -1; - } + software_watchpoint_add_no_memory_location (&b->base, frame_pspace); } else if (!within_current_scope) { @@ -6667,15 +6690,15 @@ breakpoint_address_bits (struct breakpoint *b) int print_address_bits = 0; struct bp_location *loc; + /* Software watchpoints that aren't watching memory don't have an + address to print. */ + if (is_no_memory_software_watchpoint (b)) + return 0; + for (loc = b->loc; loc; loc = loc->next) { int addr_bit; - /* Software watchpoints that aren't watching memory don't have - an address to print. */ - if (b->type == bp_watchpoint && loc->watchpoint_type == -1) - continue; - addr_bit = gdbarch_addr_bit (loc->gdbarch); if (addr_bit > print_address_bits) print_address_bits = addr_bit; -- 1.9.3