From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23264 invoked by alias); 10 Jan 2002 22:07:11 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 23168 invoked from network); 10 Jan 2002 22:07:09 -0000 Received: from unknown (HELO cygnus.com) (205.180.230.5) by sources.redhat.com with SMTP; 10 Jan 2002 22:07:09 -0000 Received: from localhost.cygnus.com (cse.sfbay.redhat.com [205.180.230.236]) by runyon.cygnus.com (8.8.7-cygnus/8.8.7) with ESMTP id OAA29364; Thu, 10 Jan 2002 14:07:04 -0800 (PST) Received: (from ezannoni@localhost) by localhost.cygnus.com (8.11.2/8.11.2) id g0ALJqr01837; Thu, 10 Jan 2002 16:19:52 -0500 From: Elena Zannoni MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15422.1400.581502.931643@localhost.cygnus.com> Date: Thu, 10 Jan 2002 14:07:00 -0000 To: Jason Merrill Cc: gdb-patches@sources.redhat.com Subject: Re: PATCH to dwarf2read.c:decode_locdesc In-Reply-To: References: X-Mailer: VM 7.00 under Emacs 20.7.1 X-SW-Source: 2002-01/txt/msg00254.txt.bz2 Jason Merrill writes: > I noticed that even with Daniel's recent C++ improvements (thanks!), vbase > handling was still broken with dwarf2 because dwarf2read.c still didn't > grok the complex location expression gcc now emits. As it happens, by a > fluke simply adding support for the missing opcodes causes decode_locdesc > to produce the answer gdb wants. The dwarf2 output expects the stack to > start with the address of the object and produce the address of the base, > whereas in the current gdb the stack starts with 0 and produces the > negation of whatever constant is provided, which matches the stabs output. > > Of course, gdb tries to complain about the derefs twice in the process, but > is currently muffled. > > So, it's not a complete solution, but it's entirely correct and fixes > gdb.c++/inherit.exp. > Sigh! There have been several attempts to get the location expression support in gdb. They all stopped dead for one reason or another. There are several WIP patches out there. http://sources.redhat.com/ml/gdb-patches/2001-02/msg00276.html http://sources.redhat.com/ml/gdb-patches/2001-06/msg00390.html http://sources.redhat.com/ml/gdb-patches/2001-06/msg00502.html http://sources.redhat.com/ml/gdb-patches/2001-07/msg00008.html Hmm, DW_OP_dup wasn't handled in the above patches. Anyway, this is approved. Elena > OK to commit? > > 2002-01-10 Jason Merrill > > * dwarf2read.c (decode_locdesc): Implement DW_OP_litn, DW_OP_dup. > Fix DW_OP_minus. > > *** dwarf2read.c.~1~ Tue Jan 8 14:17:30 2002 > --- dwarf2read.c Thu Jan 10 11:54:45 2002 > *************** decode_locdesc (struct dwarf_block *blk, > *** 5807,5812 **** > --- 5807,5847 ---- > op = data[i++]; > switch (op) > { > + case DW_OP_lit0: > + case DW_OP_lit1: > + case DW_OP_lit2: > + case DW_OP_lit3: > + case DW_OP_lit4: > + case DW_OP_lit5: > + case DW_OP_lit6: > + case DW_OP_lit7: > + case DW_OP_lit8: > + case DW_OP_lit9: > + case DW_OP_lit10: > + case DW_OP_lit11: > + case DW_OP_lit12: > + case DW_OP_lit13: > + case DW_OP_lit14: > + case DW_OP_lit15: > + case DW_OP_lit16: > + case DW_OP_lit17: > + case DW_OP_lit18: > + case DW_OP_lit19: > + case DW_OP_lit20: > + case DW_OP_lit21: > + case DW_OP_lit22: > + case DW_OP_lit23: > + case DW_OP_lit24: > + case DW_OP_lit25: > + case DW_OP_lit26: > + case DW_OP_lit27: > + case DW_OP_lit28: > + case DW_OP_lit29: > + case DW_OP_lit30: > + case DW_OP_lit31: > + stack[++stacki] = op - DW_OP_lit0; > + break; > + > case DW_OP_reg0: > case DW_OP_reg1: > case DW_OP_reg2: > *************** decode_locdesc (struct dwarf_block *blk, > *** 5965,5970 **** > --- 6000,6010 ---- > i += bytes_read; > break; > > + case DW_OP_dup: > + stack[stacki + 1] = stack[stacki]; > + stacki++; > + break; > + > case DW_OP_plus: > stack[stacki - 1] += stack[stacki]; > stacki--; > *************** decode_locdesc (struct dwarf_block *blk, > *** 5976,5982 **** > break; > > case DW_OP_minus: > ! stack[stacki - 1] = stack[stacki] - stack[stacki - 1]; > stacki--; > break; > > --- 6016,6022 ---- > break; > > case DW_OP_minus: > ! stack[stacki - 1] -= stack[stacki]; > stacki--; > break; >