From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27039 invoked by alias); 27 Mar 2003 15:26:55 -0000 Mailing-List: contact gdb-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sources.redhat.com Received: (qmail 27032 invoked from network); 27 Mar 2003 15:26:54 -0000 Received: from unknown (HELO crack.them.org) (65.125.64.184) by sources.redhat.com with SMTP; 27 Mar 2003 15:26:54 -0000 Received: from nevyn.them.org ([66.93.61.169] ident=mail) by crack.them.org with asmtp (Exim 3.12 #1 (Debian)) id 18ybAr-0002uz-00 for ; Thu, 27 Mar 2003 11:28:21 -0600 Received: from drow by nevyn.them.org with local (Exim 3.36 #1 (Debian)) id 18yZHI-00026H-00 for ; Thu, 27 Mar 2003 10:26:52 -0500 Date: Thu, 27 Mar 2003 15:26:00 -0000 From: Daniel Jacobowitz To: gdb@sources.redhat.com Subject: Re: Problem with virtual function pointers Message-ID: <20030327152652.GA8010@nevyn.them.org> Mail-Followup-To: gdb@sources.redhat.com References: <20030327142412.GK23762@cygbert.vinschen.de> <20030327145346.GA7253@nevyn.them.org> <20030327152022.GL23762@cygbert.vinschen.de> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20030327152022.GL23762@cygbert.vinschen.de> User-Agent: Mutt/1.5.1i X-SW-Source: 2003-03/txt/msg00372.txt.bz2 On Thu, Mar 27, 2003 at 04:20:22PM +0100, Corinna Vinschen wrote: > On Thu, Mar 27, 2003 at 09:53:46AM -0500, Daniel Jacobowitz wrote: > > On Thu, Mar 27, 2003 at 03:24:12PM +0100, Corinna Vinschen wrote: > > > Hi, > > > > > > I'm just investigating a problem which XStormy16 gets in > > > gdb.c++/printmethod.exp: > > > > > > print theA->virt^M > > > $1 = invalid pointer to member function^M > > > FAIL: gdb.c++/printmethod.exp: print virtual method. > > > > > > It turned out that the error happens in xstormy16_pointer_to_address(). > > > This function converts an address to a jump table entry into a pointer > > > to the actual function. To do this, it calls a conversion routine, > > > which is only called if the following condition applies: > > > > > > > > > enum type_code target = TYPE_CODE (TYPE_TARGET_TYPE (type)); > > > > > > if (target == TYPE_CODE_FUNC || target == TYPE_CODE_METHOD) > > > convert(); > > > > > > Surprisingly (at least for me) this fails for the above case. Looking > > > into type, I found that type is TYPE_CODE_PTR which is correct, but > > > target_type is TYPE_CODE_VOID! Sure, the above virtual method is of > > > type void but is that really ok? Shouldn't that be > > > > > > type: TYPE_CODE_PTR > > > type->target_type: TYPE_CODE_METHOD > > > type->target_type->target_type: TYPE_CODE_VOID > > > > > > ? > > > > Could you give me a backtrace? > > Sure. The situation is after calling `print theA->virt' and stepping > into xstormy16_pointer_to_address(). > > (top-gdb) bt > #0 xstormy16_pointer_to_address (type=0x848d628, buf=0x85f4348) > at /home/corinna/src/gdb/xstormy16-tdep.c:966 > #1 0x080fa69e in gdbarch_pointer_to_address (gdbarch=0x848ac90, > type=0x848d628, buf=0x85f4348) > at /home/corinna/src/gdb/gdbarch.c:4164 > #2 0x080b3219 in extract_typed_address (buf=0x85f4348, type=0x848d628) > at /home/corinna/src/gdb/findvar.c:197 > #3 0x080bc1a3 in unpack_long (type=0x848d628, valaddr=0x85f4348 ":®") > at /home/corinna/src/gdb/values.c:696 > #4 0x080bc2a6 in unpack_pointer (type=0x848d628, valaddr=0x85f4348 ":®") > at /home/corinna/src/gdb/values.c:775 > #5 0x0813876e in cp_print_class_method (valaddr=0x85f4348 ":®", > type=0x84aa064, stream=0x8490f08) > at /home/corinna/src/gdb/cp-valprint.c:90 There's your bug, right on schedule. Look at the line: addr = unpack_pointer (lookup_pointer_type (builtin_type_void), valaddr); Recommend using builtin_type_void_func_ptr instead of lookup_pointer_type (builtin_type_void). Does that fix it? -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer