From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14876 invoked by alias); 21 Dec 2009 15:33:15 -0000 Received: (qmail 14866 invoked by uid 22791); 21 Dec 2009 15:33:14 -0000 X-SWARE-Spam-Status: No, hits=-1.6 required=5.0 tests=AWL,BAYES_00,MSGID_FROM_MTA_HEADER,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mtagate6.de.ibm.com (HELO mtagate6.de.ibm.com) (195.212.17.166) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 21 Dec 2009 15:33:09 +0000 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate6.de.ibm.com (8.13.1/8.13.1) with ESMTP id nBLFX7vl012327 for ; Mon, 21 Dec 2009 15:33:07 GMT Received: from d12av02.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id nBLFX6781409192 for ; Mon, 21 Dec 2009 16:33:06 +0100 Received: from d12av02.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id nBLFX677028229 for ; Mon, 21 Dec 2009 16:33:06 +0100 Received: from tuxmaker.boeblingen.de.ibm.com (tuxmaker.boeblingen.de.ibm.com [9.152.85.9]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.12.11) with SMTP id nBLFX5ux028195 for ; Mon, 21 Dec 2009 16:33:05 +0100 Message-Id: <200912211533.nBLFX5ux028195@d12av02.megacenter.de.ibm.com> Received: by tuxmaker.boeblingen.de.ibm.com (sSMTP sendmail emulation); Mon, 21 Dec 2009 16:33:05 +0100 Subject: [rfc] Re-parse display expressions if architecture changes To: gdb-patches@sourceware.org Date: Mon, 21 Dec 2009 15:33:00 -0000 From: "Ulrich Weigand" MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit 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-12/txt/msg00306.txt.bz2 Hello, I've run into a problem caused by the architecture being stored in a parsed expression structure. This shows up if you use a display expression that depends on architecture features like register numbers, e.g. display/i $pc and subsequently the current architecture changes. This could happen e.g. by connecting to a remote target that provides a target description with extra registers, or in a multi-architecture scenario like Cell/B.E. when control is passed to code using a different architecture. I think the expectation with a display statement like the above should clearly be that whenever the inferior stops, the current PC is displayed according to whatever architecture is currently in force. The patch below implements this by ensuring the expression is re-parsed if the currnet architecture is different from the one the expression was originally parsed in. Tested on s390(x)-linux in conjunction with the "32-bit application with 64-bit register set" patch. Any comments? I'm planning to apply this next week. Bye, Ulrich ChangeLog: * printcmd.c: Include "arch-utils.h". (do_one_display): Re-parse expression if current architecture changed. diff -urNp gdb-orig/gdb/printcmd.c gdb-head/gdb/printcmd.c --- gdb-orig/gdb/printcmd.c 2009-12-18 17:27:13.000000000 +0100 +++ gdb-head/gdb/printcmd.c 2009-12-21 15:07:50.000000000 +0100 @@ -49,6 +49,7 @@ #include "solib.h" #include "parser-defs.h" #include "charset.h" +#include "arch-utils.h" #ifdef TUI #include "tui/tui.h" /* For tui_active et.al. */ @@ -1597,7 +1598,15 @@ do_one_display (struct display *d) if (d->enabled_p == 0) return; - if (d->exp == NULL) + /* The expression carries the architecture that was used at parse time. + This is a problem if the expression depends on architecture features + (e.g. register numbers), and the current architecture is now different. + For example, a display statement like "display/i $pc" is expected to + display the PC register of the current architecture, not the arch at + the time the display command was given. Therefore, we re-parse the + expression if the current architecture has changed. */ + if (d->exp == NULL + || d->exp->gdbarch != get_current_arch ()) { volatile struct gdb_exception ex; TRY_CATCH (ex, RETURN_MASK_ALL) -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE Ulrich.Weigand@de.ibm.com