From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32056 invoked by alias); 16 Mar 2011 02:30:55 -0000 Received: (qmail 32047 invoked by uid 22791); 16 Mar 2011 02:30:54 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL,BAYES_00,TW_CP,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from e24smtp01.br.ibm.com (HELO e24smtp01.br.ibm.com) (32.104.18.85) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 16 Mar 2011 02:30:47 +0000 Received: from /spool/local by e24smtp01.br.ibm.com with XMail ESMTP for from ; Tue, 15 Mar 2011 23:30:44 -0300 Received: from mailhub3.br.ibm.com ([9.18.232.110]) by e24smtp01.br.ibm.com ([10.172.0.143]) with XMail ESMTP; Tue, 15 Mar 2011 23:30:41 -0300 Received: from d24av02.br.ibm.com (d24av02.br.ibm.com [9.8.31.93]) by mailhub3.br.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p2G2V3FY3395726 for ; Tue, 15 Mar 2011 23:31:03 -0300 Received: from d24av02.br.ibm.com (loopback [127.0.0.1]) by d24av02.br.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p2G2Ud9v031586 for ; Tue, 15 Mar 2011 23:30:39 -0300 Received: from [9.12.225.125] ([9.12.225.125]) by d24av02.br.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id p2G2UbRS031532; Tue, 15 Mar 2011 23:30:38 -0300 Subject: Re: [RFA] Implement support for PowerPC BookE ranged breakpoints From: Thiago Jung Bauermann To: Ulrich Weigand Cc: gdb-patches ml In-Reply-To: <201103142001.p2EK156a030714@d06av02.portsmouth.uk.ibm.com> References: <201103142001.p2EK156a030714@d06av02.portsmouth.uk.ibm.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 16 Mar 2011 06:07:00 -0000 Message-ID: <1300242390.5316.11.camel@hactar> Mime-Version: 1.0 Content-Transfer-Encoding: 7bit x-cbid: 11031602-6842-0000-0000-0000010AC579 X-IsSubscribed: yes 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 X-SW-Source: 2011-03/txt/msg00830.txt.bz2 On Mon, 2011-03-14 at 21:01 +0100, Ulrich Weigand wrote: > Thiago Jung Bauermann wrote: > > I forgot to mention that in this version I don't add a new ui_out_ > > function and instead use ui_out_field_fmt in > > print_one_detail_ranged_breakpoint. I didn't even need a temporary > > stream. > > Well yes, but by duplicating the logic how platform-specific addresses > are printed ... I was hoping to avoid that. The idea is that maybe > at some point in the future we will support more complex address output > formats (e.g. segmented addresses), and it would be good to have as few > place as possible that need to be changed to do so. > > Thus I'd prefer to not duplicate the logic in ui_out_field_core_addr, > but rather just call it twice (using a temporary stream). ui_out_field_core_addr takes a struct ui_out, so I don't know how to make it print to a temporary stream so I can call it twice from print_one_detail_ranged_breakpoint without having to specify a different field name in each call. What about putting the address-printing logic in a function which uses a temporary stream, then make both ui_out_field_core_addr and print_one_detail_ranged_breakpoint use it? The patch below implements the idea. OTOH, does it make sense to worry about fields at all? The string I'm printing doesn't belong to any column in the info breakpoint output. It is an independent, additional line below the line with breakpoint information, at least that's how I think of it. Then perhaps I shouldn't be calling any ui_out_field_ function at all, but rather something else which prints an address to a ui_out... -- []'s Thiago Jung Bauermann IBM Linux Technology Center diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index d36c663..a93f09d 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -8386,28 +8386,25 @@ static void print_one_detail_ranged_breakpoint (const struct breakpoint *b, struct ui_out *uiout) { - int addr_bit, hex_width; CORE_ADDR address_start, address_end; struct bp_location *bl = b->loc; + struct ui_stream *stb = ui_out_stream_new (uiout); + struct cleanup *cleanup = make_cleanup_ui_out_stream_delete (stb); gdb_assert (bl); - addr_bit = gdbarch_addr_bit (bl->gdbarch); - hex_width = addr_bit / 4; address_start = bl->address; address_end = address_start + bl->length - 1; - if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT)) - { - address_start &= ((CORE_ADDR) 1 << addr_bit) - 1; - address_end &= ((CORE_ADDR) 1 << addr_bit) - 1; - } - ui_out_text (uiout, "\taddress range: "); - ui_out_field_fmt (uiout, "addr", "[%s, %s]", - hex_string_custom (address_start, hex_width), - hex_string_custom (address_end, hex_width)); - ui_out_text (uiout, "\n"); + fputs_unfiltered ("[", stb->stream); + print_core_address (stb->stream, bl->gdbarch, address_start); + fputs_unfiltered (", ", stb->stream); + print_core_address (stb->stream, bl->gdbarch, address_end); + fputs_unfiltered ("]\n", stb->stream); + ui_out_field_stream (uiout, "addr", stb); + + do_cleanups (cleanup); } /* Implement the "print_mention" breakpoint_ops method for diff --git a/gdb/ui-out.c b/gdb/ui-out.c index 2cd1a54..c2962c3 100644 --- a/gdb/ui-out.c +++ b/gdb/ui-out.c @@ -486,15 +486,12 @@ ui_out_field_fmt_int (struct ui_out *uiout, uo_field_int (uiout, fldno, input_width, input_align, fldname, value); } +/* This function is described in "ui-out.h". */ + void -ui_out_field_core_addr (struct ui_out *uiout, - const char *fldname, - struct gdbarch *gdbarch, - CORE_ADDR address) +print_core_address (struct ui_file *stb, struct gdbarch *gdbarch, + CORE_ADDR address) { - /* Maximum size string returned by hex_string_custom is 50 chars. - This buffer must be bigger than that, for safety. */ - char addstr[64]; int addr_bit = gdbarch_addr_bit (gdbarch); if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT)) @@ -504,11 +501,23 @@ ui_out_field_core_addr (struct ui_out *uiout, that returns the language localized string formatted to a width based on gdbarch_addr_bit. */ if (addr_bit <= 32) - strcpy (addstr, hex_string_custom (address, 8)); + fputs_unfiltered (hex_string_custom (address, 8), stb); else - strcpy (addstr, hex_string_custom (address, 16)); + fputs_unfiltered (hex_string_custom (address, 16), stb); +} + +void +ui_out_field_core_addr (struct ui_out *uiout, + const char *fldname, + struct gdbarch *gdbarch, + CORE_ADDR address) +{ + struct ui_stream *stb = ui_out_stream_new (uiout); + struct cleanup *cleanup = make_cleanup_ui_out_stream_delete (stb); - ui_out_field_string (uiout, fldname, addstr); + print_core_address (stb->stream, gdbarch, address); + ui_out_field_stream (uiout, fldname, stb); + do_cleanups (cleanup); } void diff --git a/gdb/ui-out.h b/gdb/ui-out.h index 5265902..09442f2 100644 --- a/gdb/ui-out.h +++ b/gdb/ui-out.h @@ -282,4 +282,9 @@ extern struct ui_out *ui_out_new (struct ui_out_impl *impl, extern int ui_out_redirect (struct ui_out *uiout, struct ui_file *outstream); +/* Print ADDRESS in hexadecimal notation to the given STREAM. */ + +extern void print_core_address (struct ui_file *stb, + struct gdbarch *gdbarch, CORE_ADDR address); + #endif /* UI_OUT_H */