* [RFA] patch for 2384, dangling TYPE_VPTR_BASETYPE
@ 2007-12-14 0:26 Doug Evans
2007-12-14 6:23 ` Daniel Jacobowitz
0 siblings, 1 reply; 9+ messages in thread
From: Doug Evans @ 2007-12-14 0:26 UTC (permalink / raw)
To: gdb-patches; +Cc: Jim Blandy
[-- Attachment #1: Type: text/plain, Size: 569 bytes --]
I think(!) this patch is reasonable. It seems to be in line with what
Jim has in mind
(based on my interpretation of your comments Jim on the gdb list -
please correct
me if I'm wrong of course).
When gdb resolves type information for class "derived" from objfile
gdb2384 (from the testcase), it fills in the TYPE_VPTR_BASETYPE field
with class "base"
from objfile gdb2384-base.so. When the program is rerun the type
information for base-in-so-base.so is discarded leaving
TYPE_VPTR_BASETYPE dangling.
Ok to check in? Or any suggestions for what's needed instead?
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: gdb-071213-2384-1.patch --]
[-- Type: text/x-patch; name=gdb-071213-2384-1.patch, Size: 5659 bytes --]
2007-12-13 Doug Evans <dje@google.com>
PR 2384
* gdbtypes.c (fill_in_vptr_fieldno): Don't set TYPE_VPTR_FIELDNO,
TYPE_VPTR_BASETYPE if from different objfile.
* gdb.cp/gdb2384.exp: New file.
* gdb.cp/gdb2384.cc: New file.
* gdb.cp/gdb2384-base.h: New file.
* gdb.cp/gdb2384-base.cc: New file.
Index: gdbtypes.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtypes.c,v
retrieving revision 1.140
diff -u -p -u -p -r1.140 gdbtypes.c
--- gdbtypes.c 4 Dec 2007 23:33:00 -0000 1.140
+++ gdbtypes.c 13 Dec 2007 23:59:35 -0000
@@ -1307,8 +1307,13 @@ fill_in_vptr_fieldno (struct type *type)
fill_in_vptr_fieldno (baseclass);
if (TYPE_VPTR_FIELDNO (baseclass) >= 0)
{
- TYPE_VPTR_FIELDNO (type) = TYPE_VPTR_FIELDNO (baseclass);
- TYPE_VPTR_BASETYPE (type) = TYPE_VPTR_BASETYPE (baseclass);
+ /* If the type comes from a different objfile we can't use it
+ here, it may have a different lifetime. PR 2384 */
+ if (TYPE_OBJFILE (type) == TYPE_OBJFILE (baseclass))
+ {
+ TYPE_VPTR_FIELDNO (type) = TYPE_VPTR_FIELDNO (baseclass);
+ TYPE_VPTR_BASETYPE (type) = TYPE_VPTR_BASETYPE (baseclass);
+ }
break;
}
}
Index: testsuite/gdb.cp/gdb2384-base.cc
===================================================================
RCS file: testsuite/gdb.cp/gdb2384-base.cc
diff -N testsuite/gdb.cp/gdb2384-base.cc
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.cp/gdb2384-base.cc 13 Dec 2007 23:59:35 -0000
@@ -0,0 +1,12 @@
+#include "gdb2384-base.h"
+
+base::base (int _x)
+ : x (_x)
+{
+}
+
+int
+base::meth ()
+{
+ return x;
+}
Index: testsuite/gdb.cp/gdb2384-base.h
===================================================================
RCS file: testsuite/gdb.cp/gdb2384-base.h
diff -N testsuite/gdb.cp/gdb2384-base.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.cp/gdb2384-base.h 13 Dec 2007 23:59:35 -0000
@@ -0,0 +1,7 @@
+class base
+{
+ public:
+ base (int _x);
+ int x;
+ virtual int meth ();
+};
Index: testsuite/gdb.cp/gdb2384.cc
===================================================================
RCS file: testsuite/gdb.cp/gdb2384.cc
diff -N testsuite/gdb.cp/gdb2384.cc
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.cp/gdb2384.cc 13 Dec 2007 23:59:35 -0000
@@ -0,0 +1,22 @@
+#include "gdb2384-base.h"
+
+class derived : public base
+{
+ public:
+ derived (int);
+};
+
+derived::derived (int _x)
+ : base (_x)
+{
+}
+
+int g;
+
+int
+main ()
+{
+ derived d (42);
+ g = d.meth (); // set breakpoint here
+ return 0;
+}
Index: testsuite/gdb.cp/gdb2384.exp
===================================================================
RCS file: testsuite/gdb.cp/gdb2384.exp
diff -N testsuite/gdb.cp/gdb2384.exp
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.cp/gdb2384.exp 13 Dec 2007 23:59:35 -0000
@@ -0,0 +1,99 @@
+# Copyright 2007 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# When gdb resolves type information for class "derived" from objfile
+# gdb2384, it use to fill in the TYPE_VPTR_BASETYPE field with class "base"
+# from objfile gdb2384-base.so. When the program is rerun the type
+# information for base-in-so-base.so is discarded leaving
+# TYPE_VPTR_BASETYPE dangling.
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+if { [skip_cplus_tests] } { continue }
+
+set prms_id 2384
+set bug_id 0
+
+set testfile "gdb2384"
+set srcfile ${testfile}.cc
+set binfile $objdir/$subdir/$testfile
+
+set libfile "gdb2384-base"
+set libsrcfile ${libfile}.cc
+set sofile $objdir/$subdir/"${libfile}.so"
+
+# Create and source the file that provides information about the compiler
+# used to compile the test case.
+if [get_compiler_info ${binfile} "c++"] {
+ return -1
+}
+
+if { [gdb_compile_shlib $srcdir/$subdir/$libsrcfile $sofile {debug c++}] != ""
+ || [gdb_compile $srcdir/$subdir/$srcfile $binfile executable [list debug "c++" shlib=${sofile}]] != ""} {
+ untested gdb2384.exp
+ return -1
+}
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+#gdb_load_shlibs ${sofile}
+
+set bp_location [gdb_get_line_number "set breakpoint here"]
+
+# Set a breakpoint with multiple locations.
+
+gdb_test "break $srcfile:$bp_location" \
+ "Breakpoint.*at.* file .*$srcfile, line.*" \
+ "set breakpoint"
+
+gdb_run_cmd
+gdb_expect {
+ -re "Breakpoint \[0-9\]+,.*main \\(.*\\).*$gdb_prompt $" {
+ pass "run to breakpoint"
+ }
+ -re "$gdb_prompt $" {
+ fail "run to breakpoint"
+ }
+ timeout {
+ fail "run to breakpoint (timeout)"
+ }
+}
+
+gdb_test "print d.meth ()" \
+ ".*42.*" \
+ "print d.meth ()"
+
+# Now try again. gdb's without the fix will hopefully segv here
+
+gdb_run_cmd
+gdb_expect {
+ -re "Breakpoint \[0-9\]+,.*main \\(.*\\).*$gdb_prompt $" {
+ pass "run to breakpoint #2"
+ }
+ -re "$gdb_prompt $" {
+ fail "run to breakpoint #2"
+ }
+ timeout {
+ fail "run to breakpoint #2 (timeout)"
+ }
+}
+
+gdb_test "print d.meth ()" \
+ ".*42.*" \
+ "gdb2384"
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [RFA] patch for 2384, dangling TYPE_VPTR_BASETYPE
2007-12-14 0:26 [RFA] patch for 2384, dangling TYPE_VPTR_BASETYPE Doug Evans
@ 2007-12-14 6:23 ` Daniel Jacobowitz
2007-12-14 20:44 ` Doug Evans
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Daniel Jacobowitz @ 2007-12-14 6:23 UTC (permalink / raw)
To: Doug Evans; +Cc: gdb-patches, Jim Blandy
On Thu, Dec 13, 2007 at 04:10:55PM -0800, Doug Evans wrote:
> Ok to check in? Or any suggestions for what's needed instead?
Your patch seems strange to me. Do we need the new fieldno /
basetype, or not? If we don't, we shouldn't be calculating it at all;
if we do, there should be something detectable which breaks when you
do this. It's not just a cache, since the interface doesn't offer any
other way to return the new fieldno / basetype besides in-place
modification.
I happen to know that for GNU v3 - which is in practice the only thing
that any GDB users use nowadays - we don't need these fields any more.
We still use them, but we could do without, since the ABI is quite
clear on where to find the vtable pointer.
For GNU v2, which is theoretically still supported, we do need this
information.
--
Daniel Jacobowitz
CodeSourcery
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [RFA] patch for 2384, dangling TYPE_VPTR_BASETYPE
2007-12-14 6:23 ` Daniel Jacobowitz
@ 2007-12-14 20:44 ` Doug Evans
2007-12-14 21:27 ` Doug Evans
2007-12-15 13:15 ` Doug Evans
2007-12-20 19:49 ` Doug Evans
2 siblings, 1 reply; 9+ messages in thread
From: Doug Evans @ 2007-12-14 20:44 UTC (permalink / raw)
To: gdb-patches
On Dec 13, 2007 4:29 PM, Daniel Jacobowitz <drow@false.org> wrote:
> On Thu, Dec 13, 2007 at 04:10:55PM -0800, Doug Evans wrote:
> > Ok to check in? Or any suggestions for what's needed instead?
>
> Your patch seems strange to me. Do we need the new fieldno /
> basetype, or not? If we don't, we shouldn't be calculating it at all;
> if we do, there should be something detectable which breaks when you
> do this. It's not just a cache, since the interface doesn't offer any
> other way to return the new fieldno / basetype besides in-place
> modification.
For the test case in the patch, type info for the derived class is left
as opaque/stub, and when the vptr is needed check_typedef is called
which notices the fact that is has an incomplete type and does a lookup
by name to get the complete typo info. In this case check_typedef
notices it has a cross-objfile reference and returns a pointer to the
complete type info without updating the original type. This way cross-objfile
pointers don't get created and the required data is still obtained when needed.
There are other use cases. If base and derived are both in the
same compilation unit then dwarf2read.c will fill in
TYPE_VPTR_{BASETYPE,FIELDNO} (and presumably stabsread.c
but I don't know offhand), and fill_in_vptr_fieldno is a nop.
Another use case is if base and derived are in different compilation
units but in the same objfile. Here dwarf2read.c will leave the base
class as a stub for derived's type info. Later when vptr is needed
fill_in_vptr_fieldno is called and it will notice fieldno < 0 and call
check_typedef on the base type. check_typedef will see that
orig_type and newtype are in the same objfile and will call
make_cv_type to update the original type with the complete
type info.
> I happen to know that for GNU v3 - which is in practice the only thing
> that any GDB users use nowadays - we don't need these fields any more.
> We still use them, but we could do without, since the ABI is quite
> clear on where to find the vtable pointer.
>
> For GNU v2, which is theoretically still supported, we do need this
> information.
Clearly fill_in_vptr_fieldno can't create cross-objfile pointers.
All callers of fill_in_vptr_fieldno (should) expect that it may fail.
I'm not quite sure what you're suggesting, as it relates to the patch.
The v3 abi still needs logic to handle cross-objfile references,
though it could be done without the use of fill_in_vptr_fieldno.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [RFA] patch for 2384, dangling TYPE_VPTR_BASETYPE
2007-12-14 20:44 ` Doug Evans
@ 2007-12-14 21:27 ` Doug Evans
0 siblings, 0 replies; 9+ messages in thread
From: Doug Evans @ 2007-12-14 21:27 UTC (permalink / raw)
To: gdb-patches
One improvement might be to add more comments at the change site
to clarify the situation. e.g. when fill_in_vptr_fieldno does useful work
and when it doesn't. [assuming fill_in_vptr_fieldno remains ... it's not
clear to me whether the ultimate fix will remove it]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [RFA] patch for 2384, dangling TYPE_VPTR_BASETYPE
2007-12-14 6:23 ` Daniel Jacobowitz
2007-12-14 20:44 ` Doug Evans
@ 2007-12-15 13:15 ` Doug Evans
2007-12-20 19:49 ` Doug Evans
2 siblings, 0 replies; 9+ messages in thread
From: Doug Evans @ 2007-12-15 13:15 UTC (permalink / raw)
To: gdb-patches
On Dec 13, 2007 4:29 PM, Daniel Jacobowitz <drow@false.org> wrote:
> On Thu, Dec 13, 2007 at 04:10:55PM -0800, Doug Evans wrote:
> > Ok to check in? Or any suggestions for what's needed instead?
>
> Your patch seems strange to me. Do we need the new fieldno /
> basetype, or not? If we don't, we shouldn't be calculating it at all;
> if we do, there should be something detectable which breaks when you
> do this. It's not just a cache, since the interface doesn't offer any
> other way to return the new fieldno / basetype besides in-place
> modification.
Hold the fort, I think I see what you're saying now.
I'll send another patch for review.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [RFA] patch for 2384, dangling TYPE_VPTR_BASETYPE
2007-12-14 6:23 ` Daniel Jacobowitz
2007-12-14 20:44 ` Doug Evans
2007-12-15 13:15 ` Doug Evans
@ 2007-12-20 19:49 ` Doug Evans
2008-01-28 19:05 ` Doug Evans
2008-01-30 1:23 ` Daniel Jacobowitz
2 siblings, 2 replies; 9+ messages in thread
From: Doug Evans @ 2007-12-20 19:49 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 938 bytes --]
On Dec 13, 2007 4:29 PM, Daniel Jacobowitz <drow@false.org> wrote:
> On Thu, Dec 13, 2007 at 04:10:55PM -0800, Doug Evans wrote:
> > Ok to check in? Or any suggestions for what's needed instead?
>
> Your patch seems strange to me. Do we need the new fieldno /
> basetype, or not? If we don't, we shouldn't be calculating it at all;
> if we do, there should be something detectable which breaks when you
> do this. It's not just a cache, since the interface doesn't offer any
> other way to return the new fieldno / basetype besides in-place
> modification.
>
> I happen to know that for GNU v3 - which is in practice the only thing
> that any GDB users use nowadays - we don't need these fields any more.
> We still use them, but we could do without, since the ABI is quite
> clear on where to find the vtable pointer.
>
> For GNU v2, which is theoretically still supported, we do need this
> information.
Silly me. How about this?
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: gdb-071220-2384-3.patch --]
[-- Type: text/x-patch; name=gdb-071220-2384-3.patch, Size: 15656 bytes --]
2007-12-20 Doug Evans <dje@google.com>
PR 2384
* gdbtypes.c (get_vptr_fieldno): Renamed from fill_in_vptr_fieldno.
Return basetype, fieldno if found. All callers updated.
Don't cache TYPE_VPTR_FIELDNO, TYPE_VPTR_BASETYPE if from different
objfile.
* gdbtypes.h (get_vptr_fieldno): Renamed from fill_in_vptr_fieldno.
* symfile.h (fill_in_vptr_fieldno): Delete.
* gdb.cp/gdb2384.exp: New file.
* gdb.cp/gdb2384.cc: New file.
* gdb.cp/gdb2384-base.h: New file.
* gdb.cp/gdb2384-base.cc: New file.
Index: gdbtypes.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtypes.c,v
retrieving revision 1.141
diff -u -p -u -p -r1.141 gdbtypes.c
--- gdbtypes.c 20 Dec 2007 17:17:21 -0000 1.141
+++ gdbtypes.c 20 Dec 2007 19:25:59 -0000
@@ -1282,15 +1282,19 @@ lookup_struct_elt_type (struct type *typ
return (struct type *) -1; /* For lint */
}
-/* If possible, make the vptr_fieldno and vptr_basetype fields of TYPE
- valid. Callers should be aware that in some cases (for example,
+/* Lookup the vptr basetype/fieldno values for TYPE.
+ If found store vptr_basetype in *BASETYPEP if non-NULL, and return
+ vptr_fieldno. Also, if found and basetype is from the same objfile,
+ cache the results.
+ If not found, return -1 and ignore BASETYPEP.
+ Callers should be aware that in some cases (for example,
the type or one of its baseclasses is a stub type and we are
debugging a .o file), this function will not be able to find the
virtual function table pointer, and vptr_fieldno will remain -1 and
- vptr_basetype will remain NULL. */
+ vptr_basetype will remain NULL or incomplete. */
-void
-fill_in_vptr_fieldno (struct type *type)
+int
+get_vptr_fieldno (struct type *type, struct type **basetypep)
{
CHECK_TYPEDEF (type);
@@ -1302,16 +1306,34 @@ fill_in_vptr_fieldno (struct type *type)
is virtual (and hence we cannot share the table pointer). */
for (i = 0; i < TYPE_N_BASECLASSES (type); i++)
{
- struct type *baseclass = check_typedef (TYPE_BASECLASS (type,
- i));
- fill_in_vptr_fieldno (baseclass);
- if (TYPE_VPTR_FIELDNO (baseclass) >= 0)
+ struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
+ int fieldno;
+ struct type *basetype;
+
+ fieldno = get_vptr_fieldno (baseclass, &basetype);
+ if (fieldno >= 0)
{
- TYPE_VPTR_FIELDNO (type) = TYPE_VPTR_FIELDNO (baseclass);
- TYPE_VPTR_BASETYPE (type) = TYPE_VPTR_BASETYPE (baseclass);
- break;
+ /* If the type comes from a different objfile we can't cache
+ it, it may have a different lifetime. PR 2384 */
+ if (TYPE_OBJFILE (type) == TYPE_OBJFILE (baseclass))
+ {
+ TYPE_VPTR_FIELDNO (type) = fieldno;
+ TYPE_VPTR_BASETYPE (type) = basetype;
+ }
+ if (basetypep)
+ *basetypep = basetype;
+ return fieldno;
}
}
+
+ /* Not found. */
+ return -1;
+ }
+ else
+ {
+ if (basetypep)
+ *basetypep = TYPE_VPTR_BASETYPE (type);
+ return TYPE_VPTR_FIELDNO (type);
}
}
Index: gdbtypes.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbtypes.h,v
retrieving revision 1.82
diff -u -p -u -p -r1.82 gdbtypes.h
--- gdbtypes.h 4 Dec 2007 23:33:00 -0000 1.82
+++ gdbtypes.h 20 Dec 2007 19:25:59 -0000
@@ -375,7 +375,9 @@ struct main_type
/* Field number of the virtual function table pointer in
VPTR_BASETYPE. If -1, we were unable to find the virtual
function table pointer in initial symbol reading, and
- fill_in_vptr_fieldno should be called to find it if possible.
+ get_vptr_fieldno should be called to find it if possible.
+ get_vptr_fieldno will update this field if possible.
+ Otherwise the value is left at -1.
Unused if this type does not have virtual functions. */
@@ -1274,7 +1276,7 @@ extern struct type *lookup_typename (cha
extern struct type *lookup_template_type (char *, struct type *,
struct block *);
-extern void fill_in_vptr_fieldno (struct type *);
+extern int get_vptr_fieldno (struct type *, struct type **);
extern int get_destructor_fn_field (struct type *, int *, int *);
Index: symfile.h
===================================================================
RCS file: /cvs/src/src/gdb/symfile.h,v
retrieving revision 1.43
diff -u -p -u -p -r1.43 symfile.h
--- symfile.h 22 Oct 2007 01:16:34 -0000 1.43
+++ symfile.h 20 Dec 2007 19:25:59 -0000
@@ -207,8 +207,6 @@ extern struct symtab *allocate_symtab (c
extern int free_named_symtabs (char *);
-extern void fill_in_vptr_fieldno (struct type *);
-
extern void add_symtab_fns (struct sym_fns *);
extern void syms_from_objfile (struct objfile *,
Index: gnu-v2-abi.c
===================================================================
RCS file: /cvs/src/src/gdb/gnu-v2-abi.c,v
retrieving revision 1.26
diff -u -p -u -p -r1.26 gnu-v2-abi.c
--- gnu-v2-abi.c 5 Sep 2007 00:07:07 -0000 1.26
+++ gnu-v2-abi.c 20 Dec 2007 19:25:59 -0000
@@ -88,8 +88,6 @@ gnuv2_virtual_fn_field (struct value **a
{
struct value *arg1 = *arg1p;
struct type *type1 = check_typedef (value_type (arg1));
-
-
struct type *entry_type;
/* First, get the virtual function table pointer. That comes
with a strange type, so cast it to type `pointer to long' (which
@@ -102,6 +100,9 @@ gnuv2_virtual_fn_field (struct value **a
(LONGEST) TYPE_FN_FIELD_VOFFSET (f, j));
struct type *fcontext = TYPE_FN_FIELD_FCONTEXT (f, j);
struct type *context;
+ struct type *context_vptr_basetype;
+ int context_vptr_fieldno;
+
if (fcontext == NULL)
/* We don't have an fcontext (e.g. the program was compiled with
g++ version 1). Try to get the vtbl from the TYPE_VPTR_BASETYPE.
@@ -123,13 +124,13 @@ gnuv2_virtual_fn_field (struct value **a
/* This type may have been defined before its virtual function table
was. If so, fill in the virtual function table entry for the
type now. */
- if (TYPE_VPTR_FIELDNO (context) < 0)
- fill_in_vptr_fieldno (context);
+ context_vptr_fieldno = get_vptr_fieldno (context, &context_vptr_basetype);
+ /* FIXME: What to do if vptr_fieldno is still -1? */
/* The virtual function table is now an array of structures
which have the form { int16 offset, delta; void *pfn; }. */
- vtbl = value_primitive_field (arg1, 0, TYPE_VPTR_FIELDNO (context),
- TYPE_VPTR_BASETYPE (context));
+ vtbl = value_primitive_field (arg1, 0, context_vptr_fieldno,
+ context_vptr_basetype);
/* With older versions of g++, the vtbl field pointed to an array
of structures. Nowadays it points directly to the structure. */
@@ -194,6 +195,8 @@ gnuv2_value_rtti_type (struct value *v,
struct symbol *sym;
char *demangled_name, *p;
struct type *btype;
+ struct type *known_type_vptr_basetype;
+ int known_type_vptr_fieldno;
if (full)
*full = 0;
@@ -214,18 +217,18 @@ gnuv2_value_rtti_type (struct value *v,
the type info functions, which are always right. Deal with it
until then. */
- /* If the type has no vptr fieldno, try to get it filled in */
- if (TYPE_VPTR_FIELDNO(known_type) < 0)
- fill_in_vptr_fieldno(known_type);
+ /* Try to get the vptr basetype, fieldno. */
+ known_type_vptr_fieldno = get_vptr_fieldno (known_type,
+ &known_type_vptr_basetype);
- /* If we still can't find one, give up */
- if (TYPE_VPTR_FIELDNO(known_type) < 0)
+ /* If we can't find it, give up. */
+ if (known_type_vptr_fieldno < 0)
return NULL;
/* Make sure our basetype and known type match, otherwise, cast
so we can get at the vtable properly.
*/
- btype = TYPE_VPTR_BASETYPE (known_type);
+ btype = known_type_vptr_basetype;
CHECK_TYPEDEF (btype);
if (btype != known_type )
{
@@ -238,10 +241,10 @@ gnuv2_value_rtti_type (struct value *v,
we'd waste a bunch of time figuring out we already know the type.
Besides, we don't care about the type, just the actual pointer
*/
- if (VALUE_ADDRESS (value_field (v, TYPE_VPTR_FIELDNO (known_type))) == 0)
+ if (VALUE_ADDRESS (value_field (v, known_type_vptr_fieldno)) == 0)
return NULL;
- vtbl=value_as_address(value_field(v,TYPE_VPTR_FIELDNO(known_type)));
+ vtbl = value_as_address (value_field (v, known_type_vptr_fieldno));
/* Try to find a symbol that is the vtable */
minsym=lookup_minimal_symbol_by_pc(vtbl);
Index: gnu-v3-abi.c
===================================================================
RCS file: /cvs/src/src/gdb/gnu-v3-abi.c,v
retrieving revision 1.38
diff -u -p -u -p -r1.38 gnu-v3-abi.c
--- gnu-v3-abi.c 7 Nov 2007 06:53:41 -0000 1.38
+++ gnu-v3-abi.c 20 Dec 2007 19:26:00 -0000
@@ -201,6 +201,8 @@ gnuv3_rtti_type (struct value *value,
struct type *run_time_type;
struct type *base_type;
LONGEST offset_to_top;
+ struct type *values_type_vptr_basetype;
+ int values_type_vptr_fieldno;
/* We only have RTTI for class objects. */
if (TYPE_CODE (values_type) != TYPE_CODE_CLASS)
@@ -208,8 +210,9 @@ gnuv3_rtti_type (struct value *value,
/* If we can't find the virtual table pointer for values_type, we
can't find the RTTI. */
- fill_in_vptr_fieldno (values_type);
- if (TYPE_VPTR_FIELDNO (values_type) == -1)
+ values_type_vptr_fieldno = get_vptr_fieldno (values_type,
+ &values_type_vptr_basetype);
+ if (values_type_vptr_fieldno == -1)
return NULL;
if (using_enc_p)
@@ -217,7 +220,7 @@ gnuv3_rtti_type (struct value *value,
/* Fetch VALUE's virtual table pointer, and tweak it to point at
an instance of our imaginary gdb_gnu_v3_abi_vtable structure. */
- base_type = check_typedef (TYPE_VPTR_BASETYPE (values_type));
+ base_type = check_typedef (values_type_vptr_basetype);
if (values_type != base_type)
{
value = value_cast (base_type, value);
@@ -225,7 +228,7 @@ gnuv3_rtti_type (struct value *value,
*using_enc_p = 1;
}
vtable_address
- = value_as_address (value_field (value, TYPE_VPTR_FIELDNO (values_type)));
+ = value_as_address (value_field (value, values_type_vptr_fieldno));
vtable = value_at_lazy (vtable_type,
vtable_address - vtable_address_point_offset ());
@@ -381,6 +384,7 @@ gnuv3_baseclass_offset (struct type *typ
struct value *offset_val, *vbase_array;
CORE_ADDR vtable_address;
long int cur_base_offset, base_offset;
+ int vbasetype_vptr_fieldno;
/* If it isn't a virtual base, this is easy. The offset is in the
type definition. */
@@ -414,11 +418,10 @@ gnuv3_baseclass_offset (struct type *typ
we have debugging information for that baseclass. */
vbasetype = TYPE_VPTR_BASETYPE (type);
- if (TYPE_VPTR_FIELDNO (vbasetype) < 0)
- fill_in_vptr_fieldno (vbasetype);
+ vbasetype_vptr_fieldno = get_vptr_fieldno (vbasetype, NULL);
- if (TYPE_VPTR_FIELDNO (vbasetype) >= 0
- && TYPE_FIELD_BITPOS (vbasetype, TYPE_VPTR_FIELDNO (vbasetype)) != 0)
+ if (vbasetype_vptr_fieldno >= 0
+ && TYPE_FIELD_BITPOS (vbasetype, vbasetype_vptr_fieldno) != 0)
error (_("Illegal vptr offset in class %s"),
TYPE_NAME (vbasetype) ? TYPE_NAME (vbasetype) : "<unknown>");
Index: testsuite/gdb.cp/gdb2384-base.cc
===================================================================
RCS file: testsuite/gdb.cp/gdb2384-base.cc
diff -N testsuite/gdb.cp/gdb2384-base.cc
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.cp/gdb2384-base.cc 20 Dec 2007 19:26:00 -0000
@@ -0,0 +1,12 @@
+#include "gdb2384-base.h"
+
+base::base (int _x)
+ : x (_x)
+{
+}
+
+int
+base::meth ()
+{
+ return x;
+}
Index: testsuite/gdb.cp/gdb2384-base.h
===================================================================
RCS file: testsuite/gdb.cp/gdb2384-base.h
diff -N testsuite/gdb.cp/gdb2384-base.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.cp/gdb2384-base.h 20 Dec 2007 19:26:00 -0000
@@ -0,0 +1,7 @@
+class base
+{
+ public:
+ base (int _x);
+ int x;
+ virtual int meth ();
+};
Index: testsuite/gdb.cp/gdb2384.cc
===================================================================
RCS file: testsuite/gdb.cp/gdb2384.cc
diff -N testsuite/gdb.cp/gdb2384.cc
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.cp/gdb2384.cc 20 Dec 2007 19:26:00 -0000
@@ -0,0 +1,22 @@
+#include "gdb2384-base.h"
+
+class derived : public base
+{
+ public:
+ derived (int);
+};
+
+derived::derived (int _x)
+ : base (_x)
+{
+}
+
+int g;
+
+int
+main ()
+{
+ derived d (42);
+ g = d.meth (); // set breakpoint here
+ return 0;
+}
Index: testsuite/gdb.cp/gdb2384.exp
===================================================================
RCS file: testsuite/gdb.cp/gdb2384.exp
diff -N testsuite/gdb.cp/gdb2384.exp
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.cp/gdb2384.exp 20 Dec 2007 19:26:00 -0000
@@ -0,0 +1,99 @@
+# Copyright 2007 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# When gdb resolves type information for class "derived" from objfile
+# gdb2384, it use to fill in the TYPE_VPTR_BASETYPE field with class "base"
+# from objfile gdb2384-base.so. When the program is rerun the type
+# information for base-in-so-base.so is discarded leaving
+# TYPE_VPTR_BASETYPE dangling.
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+if { [skip_cplus_tests] } { continue }
+
+set prms_id 2384
+set bug_id 0
+
+set testfile "gdb2384"
+set srcfile ${testfile}.cc
+set binfile $objdir/$subdir/$testfile
+
+set libfile "gdb2384-base"
+set libsrcfile ${libfile}.cc
+set sofile $objdir/$subdir/${libfile}.so
+
+# Create and source the file that provides information about the compiler
+# used to compile the test case.
+if [get_compiler_info ${binfile} "c++"] {
+ return -1
+}
+
+if { [gdb_compile_shlib $srcdir/$subdir/$libsrcfile $sofile {debug c++}] != ""
+ || [gdb_compile $srcdir/$subdir/$srcfile $binfile executable [list debug "c++" shlib=${sofile}]] != ""} {
+ untested gdb2384.exp
+ return -1
+}
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+#gdb_load_shlibs ${sofile}
+
+set bp_location [gdb_get_line_number "set breakpoint here"]
+
+# Set a breakpoint with multiple locations.
+
+gdb_test "break $srcfile:$bp_location" \
+ "Breakpoint.*at.* file .*$srcfile, line.*" \
+ "set breakpoint"
+
+gdb_run_cmd
+gdb_expect {
+ -re "Breakpoint \[0-9\]+,.*main \\(.*\\).*$gdb_prompt $" {
+ pass "run to breakpoint"
+ }
+ -re "$gdb_prompt $" {
+ fail "run to breakpoint"
+ }
+ timeout {
+ fail "run to breakpoint (timeout)"
+ }
+}
+
+gdb_test "print d.meth ()" \
+ ".*42.*" \
+ "print d.meth ()"
+
+# Now try again. gdb's without the fix will hopefully segv here
+
+gdb_run_cmd
+gdb_expect {
+ -re "Breakpoint \[0-9\]+,.*main \\(.*\\).*$gdb_prompt $" {
+ pass "run to breakpoint #2"
+ }
+ -re "$gdb_prompt $" {
+ fail "run to breakpoint #2"
+ }
+ timeout {
+ fail "run to breakpoint #2 (timeout)"
+ }
+}
+
+gdb_test "print d.meth ()" \
+ ".*42.*" \
+ "gdb2384"
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [RFA] patch for 2384, dangling TYPE_VPTR_BASETYPE
2007-12-20 19:49 ` Doug Evans
@ 2008-01-28 19:05 ` Doug Evans
2008-01-30 1:23 ` Daniel Jacobowitz
1 sibling, 0 replies; 9+ messages in thread
From: Doug Evans @ 2008-01-28 19:05 UTC (permalink / raw)
To: gdb-patches
Ping ...
On Dec 20, 2007 11:40 AM, Doug Evans <dje@google.com> wrote:
> On Dec 13, 2007 4:29 PM, Daniel Jacobowitz <drow@false.org> wrote:
>
> > On Thu, Dec 13, 2007 at 04:10:55PM -0800, Doug Evans wrote:
> > > Ok to check in? Or any suggestions for what's needed instead?
> >
> > Your patch seems strange to me. Do we need the new fieldno /
> > basetype, or not? If we don't, we shouldn't be calculating it at all;
> > if we do, there should be something detectable which breaks when you
> > do this. It's not just a cache, since the interface doesn't offer any
> > other way to return the new fieldno / basetype besides in-place
> > modification.
> >
> > I happen to know that for GNU v3 - which is in practice the only thing
> > that any GDB users use nowadays - we don't need these fields any more.
> > We still use them, but we could do without, since the ABI is quite
> > clear on where to find the vtable pointer.
> >
> > For GNU v2, which is theoretically still supported, we do need this
> > information.
>
> Silly me. How about this?
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [RFA] patch for 2384, dangling TYPE_VPTR_BASETYPE
2007-12-20 19:49 ` Doug Evans
2008-01-28 19:05 ` Doug Evans
@ 2008-01-30 1:23 ` Daniel Jacobowitz
2008-02-03 22:19 ` Doug Evans
1 sibling, 1 reply; 9+ messages in thread
From: Daniel Jacobowitz @ 2008-01-30 1:23 UTC (permalink / raw)
To: Doug Evans; +Cc: gdb-patches
On Thu, Dec 20, 2007 at 11:40:06AM -0800, Doug Evans wrote:
> 2007-12-20 Doug Evans <dje@google.com>
>
> PR 2384
> * gdbtypes.c (get_vptr_fieldno): Renamed from fill_in_vptr_fieldno.
> Return basetype, fieldno if found. All callers updated.
> Don't cache TYPE_VPTR_FIELDNO, TYPE_VPTR_BASETYPE if from different
> objfile.
> * gdbtypes.h (get_vptr_fieldno): Renamed from fill_in_vptr_fieldno.
> * symfile.h (fill_in_vptr_fieldno): Delete.
>
> * gdb.cp/gdb2384.exp: New file.
> * gdb.cp/gdb2384.cc: New file.
> * gdb.cp/gdb2384-base.h: New file.
> * gdb.cp/gdb2384-base.cc: New file.
Thanks, this looks OK. Could you please add copyright notices to the
new test files before committing?
> +gdb_start
> +gdb_reinitialize_dir $srcdir/$subdir
> +gdb_load ${binfile}
> +#gdb_load_shlibs ${sofile}
Why's that commented out?
--
Daniel Jacobowitz
CodeSourcery
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [RFA] patch for 2384, dangling TYPE_VPTR_BASETYPE
2008-01-30 1:23 ` Daniel Jacobowitz
@ 2008-02-03 22:19 ` Doug Evans
0 siblings, 0 replies; 9+ messages in thread
From: Doug Evans @ 2008-02-03 22:19 UTC (permalink / raw)
To: gdb-patches
On Jan 29, 2008 5:06 PM, Daniel Jacobowitz <drow@false.org> wrote:
> On Thu, Dec 20, 2007 at 11:40:06AM -0800, Doug Evans wrote:
> > 2007-12-20 Doug Evans <dje@google.com>
> >
> > PR 2384
> > * gdbtypes.c (get_vptr_fieldno): Renamed from fill_in_vptr_fieldno.
> > Return basetype, fieldno if found. All callers updated.
> > Don't cache TYPE_VPTR_FIELDNO, TYPE_VPTR_BASETYPE if from different
> > objfile.
> > * gdbtypes.h (get_vptr_fieldno): Renamed from fill_in_vptr_fieldno.
> > * symfile.h (fill_in_vptr_fieldno): Delete.
> >
> > * gdb.cp/gdb2384.exp: New file.
> > * gdb.cp/gdb2384.cc: New file.
> > * gdb.cp/gdb2384-base.h: New file.
> > * gdb.cp/gdb2384-base.cc: New file.
>
> Thanks, this looks OK. Could you please add copyright notices to the
> new test files before committing?
>
> > +gdb_start
> > +gdb_reinitialize_dir $srcdir/$subdir
> > +gdb_load ${binfile}
> > +#gdb_load_shlibs ${sofile}
>
> Why's that commented out?
Thanks.
Commenting out gdb_load_shlibs was probably a leftover from some
experimentation - I put it back.
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2008-02-03 22:19 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-12-14 0:26 [RFA] patch for 2384, dangling TYPE_VPTR_BASETYPE Doug Evans
2007-12-14 6:23 ` Daniel Jacobowitz
2007-12-14 20:44 ` Doug Evans
2007-12-14 21:27 ` Doug Evans
2007-12-15 13:15 ` Doug Evans
2007-12-20 19:49 ` Doug Evans
2008-01-28 19:05 ` Doug Evans
2008-01-30 1:23 ` Daniel Jacobowitz
2008-02-03 22:19 ` Doug Evans
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox