From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7792 invoked by alias); 22 Aug 2006 20:32:47 -0000 Received: (qmail 7784 invoked by uid 22791); 22 Aug 2006 20:32:47 -0000 X-Spam-Check-By: sourceware.org Received: from sibelius.xs4all.nl (HELO sibelius.xs4all.nl) (82.92.89.47) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 22 Aug 2006 20:32:45 +0000 Received: from elgar.sibelius.xs4all.nl (root@elgar.sibelius.xs4all.nl [192.168.0.2]) by sibelius.xs4all.nl (8.13.4/8.13.4) with ESMTP id k7MKWg58001107 for ; Tue, 22 Aug 2006 22:32:42 +0200 (CEST) Received: from elgar.sibelius.xs4all.nl (kettenis@localhost.sibelius.xs4all.nl [127.0.0.1]) by elgar.sibelius.xs4all.nl (8.13.6/8.13.6) with ESMTP id k7MKWgCF021275 for ; Tue, 22 Aug 2006 22:32:42 +0200 (CEST) Received: (from kettenis@localhost) by elgar.sibelius.xs4all.nl (8.13.6/8.13.6/Submit) id k7MKWgkF006138; Tue, 22 Aug 2006 22:32:42 +0200 (CEST) Date: Tue, 22 Aug 2006 20:41:00 -0000 Message-Id: <200608222032.k7MKWgkF006138@elgar.sibelius.xs4all.nl> From: Mark Kettenis To: gdb-patches@sourceware.org Subject: [commit] Fix printing of flags from 64-bit registers Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2006-08/txt/msg00166.txt.bz2 Printing flags from 64-bit registers showed some random set bits. (gdb) print /x $pstate $1 = 0x82 (gdb) print $pstate $2 = [ IE #7 #33 #39 ] Obviously bit #33 and #39 are not set. Turns out the code that prints this invoked undefined behaviour by shifting the constant 1 (typically a 32-bit integer) over more than 32 bits. The attached patch fixes this by adding the right cast. Mark Index: ChangeLog from Mark Kettenis * valprint.c (val_print_type_code_flags): Fix for bitfields larger than 32 bits. Index: valprint.c =================================================================== RCS file: /cvs/src/src/gdb/valprint.c,v retrieving revision 1.60 diff -u -p -r1.60 valprint.c --- valprint.c 15 May 2006 16:53:38 -0000 1.60 +++ valprint.c 22 Aug 2006 20:28:09 -0000 @@ -341,13 +341,14 @@ void val_print_type_code_flags (struct type *type, const gdb_byte *valaddr, struct ui_file *stream) { - LONGEST val = unpack_long (type, valaddr); + ULONGEST val = unpack_long (type, valaddr); int bitpos, nfields = TYPE_NFIELDS (type); fputs_filtered ("[ ", stream); for (bitpos = 0; bitpos < nfields; bitpos++) { - if (TYPE_FIELD_BITPOS (type, bitpos) != -1 && (val & (1 << bitpos))) + if (TYPE_FIELD_BITPOS (type, bitpos) != -1 && + (val & ((ULONGEST)1 << bitpos))) { if (TYPE_FIELD_NAME (type, bitpos)) fprintf_filtered (stream, "%s ", TYPE_FIELD_NAME (type, bitpos));