From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8409 invoked by alias); 5 Jan 2004 00:50:38 -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 8402 invoked from network); 5 Jan 2004 00:50:37 -0000 Received: from unknown (HELO blount.mail.mindspring.net) (207.69.200.226) by sources.redhat.com with SMTP; 5 Jan 2004 00:50:37 -0000 Received: from user-119a90a.biz.mindspring.com ([66.149.36.10] helo=berman.michael-chastain.com) by blount.mail.mindspring.net with esmtp (Exim 3.33 #1) id 1AdIx2-0005Wa-00; Sun, 04 Jan 2004 19:50:36 -0500 Received: by berman.michael-chastain.com (Postfix, from userid 502) id A159C4B35A; Sun, 4 Jan 2004 19:50:48 -0500 (EST) To: dan@debian.org, gdb-patches@sources.redhat.com Subject: [rfc/cp] method stub assertions Message-Id: <20040105005048.A159C4B35A@berman.michael-chastain.com> Date: Mon, 05 Jan 2004 00:50:00 -0000 From: mec.gnu@mindspring.com (Michael Elizabeth Chastain) X-SW-Source: 2004-01/txt/msg00079.txt.bz2 I'm working on support for hp-ux aCC. When I call a C++ method, I get this assertion failure: call class_param.Aptr_a (&g_A) /house/chastain/gdb/s1/gdb/valops.c:1942: internal-error: Assertion `TYPE_DOMAIN_TYPE (fns_ptr[0].type) != NULL' failed. This assertion is in find_overload_method: /* If we are dealing with stub method types, they should have been resolved by find_method_list via value_find_oload_method_list above. */ gdb_assert (TYPE_DOMAIN_TYPE (fns_ptr[0].type) != NULL); The "domain type" is a pointer from the method to the base class that defines the virtual table for the class that contains this method. Here is some history about this assertion: http://sources.redhat.com/ml/gdb-patches/2002-05/msg00413.html Unfortunately, hpread.c does not set TYPE_DOMAIN_TYPE. As far as I can tell, only dwarf2read.c and stabsread.c set this field. Fortunately, it appears that TYPE_DOMAIN_TYPE is really only needed for calls through member pointers or member function pointers. Such calls are forbidden with hp-ux som anyways. This patch adjusts some asserts. I want to change find_overload_method so that the code asserts that methods are not stubbed (which is what it really needs), and then change evaluate_subexp_standard so that it asserts TYPE_DOMAIN_TYPE when it really uses them. After I do this, gdb gets further, but then crashes anyways in: evaluate_subexp_standard find_overload_match value_virtual_fn_field gnuv2_virtual_fn_field # WRONG! value_primitive_field check_typedef So the next problem after this is that the the abi type is set to gnu-v2. When I do "set cp-abi hpaCC", gdb calls the function, although I see further problems after that. Anyways, my questions are: Am I on the right track? Can I commit this? Tested with: native i686-pc-linux-gnu, gcc 2.95.3 3.3.2 HEAD, dwarf-2 stabs+ full regression test native hppa2.0w-hp-hpux11.11, HP aCC++ B3910B A.03.45 one little test by hand Michael C 2004-01-04 Michael Chastain * valops.c (find_overload_match): Assert that methods are not stubs. Do not assert that methods have domain types. * eval.c (evaluate_subexp_standard): Assert basetype and domain_type as needed. Index: valops.c =================================================================== RCS file: /cvs/src/src/gdb/valops.c,v retrieving revision 1.119 diff -c -3 -p -r1.119 valops.c *** valops.c 8 Nov 2003 00:13:03 -0000 1.119 --- valops.c 4 Jan 2004 23:05:43 -0000 *************** *** 1,6 **** /* Perform non-arithmetic operations on values, for GDB. Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, ! 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. This file is part of GDB. --- 1,6 ---- /* Perform non-arithmetic operations on values, for GDB. Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, ! 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of GDB. *************** find_overload_match (struct type **arg_t *** 1939,1945 **** /* If we are dealing with stub method types, they should have been resolved by find_method_list via value_find_oload_method_list above. */ ! gdb_assert (TYPE_DOMAIN_TYPE (fns_ptr[0].type) != NULL); } else { --- 1939,1946 ---- /* If we are dealing with stub method types, they should have been resolved by find_method_list via value_find_oload_method_list above. */ ! for (ix = 0; ix < num_fns; ix++) ! gdb_assert (fns_ptr[ix].is_stub == 0); } else { Index: eval.c =================================================================== RCS file: /cvs/src/src/gdb/eval.c,v retrieving revision 1.39 diff -c -3 -p -r1.39 eval.c *** eval.c 23 Nov 2003 20:41:16 -0000 1.39 --- eval.c 4 Jan 2004 23:05:44 -0000 *************** *** 1,8 **** /* Evaluate expressions for GDB. Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, ! 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software ! Foundation, Inc. This file is part of GDB. --- 1,8 ---- /* Evaluate expressions for GDB. Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, ! 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 ! Free Software Foundation, Inc. This file is part of GDB. *************** *** 36,41 **** --- 36,42 ---- #include "objc-lang.h" #include "block.h" #include "parser-defs.h" + #include "gdb_assert.h" /* Defined in symtab.c */ extern int hp_som_som_object_present; *************** evaluate_subexp_standard (struct type *e *** 996,1006 **** if (METHOD_PTR_IS_VIRTUAL (fnptr)) { int fnoffset = METHOD_PTR_TO_VOFFSET (fnptr); ! struct type *basetype; struct type *domain_type = ! TYPE_DOMAIN_TYPE (TYPE_TARGET_TYPE (VALUE_TYPE (arg1))); int i, j; ! basetype = TYPE_TARGET_TYPE (VALUE_TYPE (arg2)); if (domain_type != basetype) arg2 = value_cast (lookup_pointer_type (domain_type), arg2); basetype = TYPE_VPTR_BASETYPE (domain_type); --- 997,1011 ---- if (METHOD_PTR_IS_VIRTUAL (fnptr)) { int fnoffset = METHOD_PTR_TO_VOFFSET (fnptr); ! struct type *basetype = ! basetype = TYPE_TARGET_TYPE (VALUE_TYPE (arg2)); struct type *domain_type = ! TYPE_DOMAIN_TYPE (TYPE_TARGET_TYPE (VALUE_TYPE (arg1))); int i, j; ! ! gdb_assert (basetype != NULL); ! gdb_assert (domain_type != NULL); ! if (domain_type != basetype) arg2 = value_cast (lookup_pointer_type (domain_type), arg2); basetype = TYPE_VPTR_BASETYPE (domain_type);