From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11408 invoked by alias); 25 Apr 2009 08:50:00 -0000 Received: (qmail 11400 invoked by uid 22791); 25 Apr 2009 08:49:59 -0000 X-SWARE-Spam-Status: No, hits=-2.5 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from sibelius.xs4all.nl (HELO sibelius.xs4all.nl) (82.92.89.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 25 Apr 2009 08:49:54 +0000 Received: from brahms.sibelius.xs4all.nl (kettenis@localhost [127.0.0.1]) by brahms.sibelius.xs4all.nl (8.14.3/8.14.3) with ESMTP id n3P8n6Br004047; Sat, 25 Apr 2009 10:49:06 +0200 (CEST) Received: (from kettenis@localhost) by brahms.sibelius.xs4all.nl (8.14.3/8.14.3/Submit) id n3P8n5BU002469; Sat, 25 Apr 2009 10:49:05 +0200 (CEST) Date: Sat, 25 Apr 2009 08:50:00 -0000 Message-Id: <200904250849.n3P8n5BU002469@brahms.sibelius.xs4all.nl> From: Mark Kettenis To: brobecker@adacore.com CC: gdb-patches@sourceware.org In-reply-to: <20090425003658.GA32745@adacore.com> (message from Joel Brobecker on Fri, 24 Apr 2009 17:36:58 -0700) Subject: Re: [RFA] Fix typo in type of parameter "w" in print_wchar... References: <20090425003658.GA32745@adacore.com> 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: 2009-04/txt/msg00704.txt.bz2 > Date: Fri, 24 Apr 2009 17:36:58 -0700 > From: Joel Brobecker > > I think this is the last issue I've found so far with character set > conversions and printing... > > This one occurs on AIX while trying to print a simple ascii string. > The output looks like this: > > (gdb) p __gnat_version > $3 = " > > The problem turned out to be pretty straightforward, once I got to > understand how things are supposed to work. > > Basically, for every character in our string, we call print_wchar > to push the equivalent wchar on our itermediate wchar buffer. > The issue is that we had the wrong type for the wchar (gdb_wint_t > instead of gdb_wchar_t). gdb_wint_t is 4bytes long whereas gdb_wchar_t > is 2 bytes long. So when we do the pushing: > > obstack_grow (output, &w, sizeof (gdb_wchar_t)); > > We only push 2 bytes of the 4 bytes that w got accidently promoted to. > On ppc-aix, it's big endian, so we end up always pushing zeros... > > 2009-04-24 Joel Brobecker > > * c-lang.c (print_wchar): Use the correct type for parameter "w". > > I'm currently testing the patch on x86_64-linux... I think this is wrong. The type of a single wide character is wint_t instead of wchar_t such that it can properly hold WEOF, much in the same way as the "normal" character functions use int instead of char. The proper/safer approach is probably to do the conversion to wchar_t in print_wchar itself just before that obstack_grow() call. > diff --git a/gdb/c-lang.c b/gdb/c-lang.c > index 027e9b2..5fe04de 100644 > --- a/gdb/c-lang.c > +++ b/gdb/c-lang.c > @@ -156,7 +156,7 @@ append_string_as_wide (const char *string, struct obstack *output) > escapes across calls. */ > > static void > -print_wchar (gdb_wint_t w, const gdb_byte *orig, int orig_len, > +print_wchar (gdb_wchar_t w, const gdb_byte *orig, int orig_len, > int width, struct obstack *output, int quoter, > int *need_escapep) > {