From patchwork Fri May 10 20:19:33 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 32639 Received: (qmail 45305 invoked by alias); 10 May 2019 20:19:38 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 45295 invoked by uid 89); 10 May 2019 20:19:38 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-20.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=enumerator X-HELO: mail.efficios.com Received: from mail.efficios.com (HELO mail.efficios.com) (167.114.142.138) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 10 May 2019 20:19:36 +0000 Received: from localhost (ip6-localhost [IPv6:::1]) by mail.efficios.com (Postfix) with ESMTP id B71641E3F6A; Fri, 10 May 2019 16:19:34 -0400 (EDT) Received: from mail.efficios.com ([IPv6:::1]) by localhost (mail02.efficios.com [IPv6:::1]) (amavisd-new, port 10032) with ESMTP id bCsJWbUSdNAW; Fri, 10 May 2019 16:19:34 -0400 (EDT) Received: from localhost (ip6-localhost [IPv6:::1]) by mail.efficios.com (Postfix) with ESMTP id 331A71E3F64; Fri, 10 May 2019 16:19:34 -0400 (EDT) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.efficios.com 331A71E3F64 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=efficios.com; s=default; t=1557519574; bh=Jqel0fC9DHrBTVDfFSD2HclB8U5zdkoiYR8tgN3UUYk=; h=To:From:Message-ID:Date:MIME-Version; b=JCQhPYaaFDP0k8upr8z3msFSMJJpW9k/BbXpSQFItzj3jGpYHlU5PWVRvB16nuoIb epdRPddsAch5gYmk0IAir+XFZOm4qnbo3V1gDBDfHU4q0XJEroGKIrH5rk4sCeVjp/ SZO2l/dAIiU46BnEQzxQxkgsuvub9Kk6F7FjdywBlvwihE0E73J76EHpVkK6MTpyMD ykN/L0+VEeprKwunCIO0FOLuGjHkvDtsMZawx7jv1W+qt1xOdst/dAfhjl5En7OCqG sIRJecmFnwF4j/uZa1IH3+s0ywhPSpTaY0t2uqm9Fl2dbCMj9iJMuYRQks1OBJepJ/ AvMfYxowx8ciw== Received: from mail.efficios.com ([IPv6:::1]) by localhost (mail02.efficios.com [IPv6:::1]) (amavisd-new, port 10026) with ESMTP id qvFAAovbNbi7; Fri, 10 May 2019 16:19:34 -0400 (EDT) Received: from [172.16.0.120] (192-222-157-41.qc.cable.ebox.net [192.222.157.41]) by mail.efficios.com (Postfix) with ESMTPSA id 0D4C61E3F5C; Fri, 10 May 2019 16:19:34 -0400 (EDT) Subject: Re: [PATCH] Fix GDB build when using --disable-gdbmi To: Tom Tromey Cc: gdb-patches@sourceware.org, Tom de Vries References: <20190510183512.9955-1-simon.marchi@efficios.com> <87a7fu9me8.fsf@tromey.com> <08bf3e6b-11c5-2a90-fb66-d1eced683116@efficios.com> <871s169lbh.fsf@tromey.com> From: Simon Marchi Message-ID: <554a660d-f5d6-b83e-6702-7dc2635ee908@efficios.com> Date: Fri, 10 May 2019 16:19:33 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 MIME-Version: 1.0 In-Reply-To: <871s169lbh.fsf@tromey.com> On 2019-05-10 3:11 p.m., Tom Tromey wrote: > It's maybe strange that -fix-multi-location-breakpoint-output affects > all MI channels and not just the ones associated with the request. It > seems like if there are multiple MI channels, then this could confuse > some client. But then, making it per-channel would make it not work > nicely if a new MI-out is created for a specific command (which I guess > is done by mi_load_progress, not sure about things like interpreter-exec). I think the reason it applies globally is that it's not worth the trouble. That command only exists to help MI clients that don't want to upgrade to mi3, but want the fixed output. Supporting multiple MI clients with different requirements w.r.t. whether they want the fixed output would be a bit stretched. > I guess maybe if there's going to be a global, it could just be stuck in > breakpoint.c and then flags used for the ui-out version check currently > done in mi_multi_location_breakpoint_output_fixed. I'm not really sure > this is any better -- globals are bad, but it does avoid the #if. I tried this, and I prefer the result. WDYT? From 29d88013830589140f395975c43687053aa30dce Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Fri, 10 May 2019 12:32:41 -0400 Subject: [PATCH] Fix GDB build when using --disable-gdbmi Since commit b4be1b064860 ("Fix MI output for multi-location breakpoints") we get this error when building with --disable-gdbmi: CXXLD gdb /home/smarchi/src/binutils-gdb/gdb/breakpoint.c:6358: error: undefined reference to 'mi_multi_location_breakpoint_output_fixed(ui_out*)' This is due to breakpoint.c using a function defined in mi/mi-main.c, even though mi/mi-main.c isn't included in the build. To fix it, use the flags feature of ui_out. mi_ui_out has the new fix_multi_location_breakpoint_output flag set for versions >= 3. Also, move the global variable fix_multi_location_breakpoint_output to breakpoint.c, so it can be read there even when we build without MI. I renamed it to fix_multi_location_breakpoint_output_globally so it doesn't clash with the new enumerator. gdb/ChangeLog: * breakpoint.h (fix_multi_location_breakpoint_output_globally): New variable declaration. * breakpoint.c (fix_multi_location_breakpoint_output_globally): New variable. (print_one_breakpoint): Use ui_out::test_flags and new global variable to compute use_fixed_output. * mi/mi-main.h (mi_multi_location_breakpoint_output_fixed): Remove. * mi/mi-main.c (fix_multi_location_breakpoint_output): Remove. (mi_multi_location_breakpoint_output_fixed): Remove. (mi_cmd_fix_multi_location_breakpoint_output): Adjust to set the new variable. * mi/mi-out.c (mi_ui_out::mi_ui_out): Set fix_multi_location_breakpoint_output flag if version >= 3. * ui-out.h (enum ui_out_flag) : New enumerator. --- gdb/breakpoint.c | 8 +++++++- gdb/breakpoint.h | 5 +++++ gdb/mi/mi-main.c | 20 +------------------- gdb/mi/mi-main.h | 8 -------- gdb/mi/mi-out.c | 4 +++- gdb/ui-out.h | 7 ++++--- 6 files changed, 20 insertions(+), 32 deletions(-) diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index f6d2f36d0a40..3612318646c0 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -6349,13 +6349,19 @@ print_one_breakpoint_location (struct breakpoint *b, } } +/* See breakpoint.h. */ + +bool fix_multi_location_breakpoint_output_globally = false; + static void print_one_breakpoint (struct breakpoint *b, struct bp_location **last_loc, int allflag) { struct ui_out *uiout = current_uiout; - bool use_fixed_output = mi_multi_location_breakpoint_output_fixed (uiout); + bool use_fixed_output + = (uiout->test_flags (fix_multi_location_breakpoint_output) + || fix_multi_location_breakpoint_output_globally); gdb::optional bkpt_tuple_emitter (gdb::in_place, uiout, "bkpt"); print_one_breakpoint_location (b, NULL, 0, last_loc, allflag); diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index a91e3e334cfd..3646ea63cb81 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -1670,4 +1670,9 @@ extern void print_breakpoint (breakpoint *bp); /* Command element for the 'commands' command. */ extern cmd_list_element *commands_cmd_element; +/* Whether to use the fixed output when printing information about a + multi-location breakpoint (see PR 9659). */ + +extern bool fix_multi_location_breakpoint_output_globally; + #endif /* !defined (BREAKPOINT_H) */ diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index 2b9883cb99f4..01786c3c1e84 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -2699,31 +2699,13 @@ mi_cmd_trace_frame_collected (const char *command, char **argv, int argc) } } -/* Whether to use the fixed output when printing information about a - multi-location breakpoint (see PR 9659). */ - -static bool fix_multi_location_breakpoint_output = false; - /* See mi/mi-main.h. */ void mi_cmd_fix_multi_location_breakpoint_output (const char *command, char **argv, int argc) { - fix_multi_location_breakpoint_output = true; -} - -/* See mi/mi-main.h. */ - -bool -mi_multi_location_breakpoint_output_fixed (ui_out *uiout) -{ - mi_ui_out *mi_uiout = dynamic_cast (uiout); - - if (mi_uiout == nullptr) - return false; - - return mi_uiout->version () >= 3 || fix_multi_location_breakpoint_output; + fix_multi_location_breakpoint_output_globally = true; } void diff --git a/gdb/mi/mi-main.h b/gdb/mi/mi-main.h index 72c4e594287a..1986228d22bd 100644 --- a/gdb/mi/mi-main.h +++ b/gdb/mi/mi-main.h @@ -59,12 +59,4 @@ extern struct mi_suppress_notification mi_suppress_notification; extern void mi_cmd_fix_multi_location_breakpoint_output (const char *command, char **argv, int argc); -/* Return whether -break-list, -break-insert, =breakpoint-created and - =breakpoint-modified should use the "fixed" output format (see PR - 9659). - - Return false if UIOUT is not an MI UI. */ - -extern bool mi_multi_location_breakpoint_output_fixed (ui_out *uiout); - #endif /* MI_MI_MAIN_H */ diff --git a/gdb/mi/mi-out.c b/gdb/mi/mi-out.c index e485beef69cd..d8bee0f39279 100644 --- a/gdb/mi/mi-out.c +++ b/gdb/mi/mi-out.c @@ -280,7 +280,9 @@ mi_ui_out::version () /* Constructor for an `mi_out_data' object. */ mi_ui_out::mi_ui_out (int mi_version) -: m_suppress_field_separator (false), +: ui_out (mi_version >= 3 + ? fix_multi_location_breakpoint_output : (ui_out_flag) 0), + m_suppress_field_separator (false), m_suppress_output (false), m_mi_version (mi_version) { diff --git a/gdb/ui-out.h b/gdb/ui-out.h index 8d183060b533..9eba70eedac6 100644 --- a/gdb/ui-out.h +++ b/gdb/ui-out.h @@ -49,9 +49,10 @@ enum ui_align /* flags enum */ enum ui_out_flag - { - ui_source_list = (1 << 0), - }; +{ + ui_source_list = (1 << 0), + fix_multi_location_breakpoint_output = (1 << 1), +}; DEF_ENUM_FLAGS_TYPE (ui_out_flag, ui_out_flags);