diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/guile/scm-type.c | 19 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.guile/scm-value.exp | 3 |
4 files changed, 34 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f997cd6..67cc7dd 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,11 @@ 2014-03-13 Doug Evans <xdje42@gmail.com> + PR guile/16612 + * guile/scm-type.c (tyscm_copy_type_recursive): Move type to its + new eq?-hashtab. + +2014-03-13 Doug Evans <xdje42@gmail.com> + * value.c (record_latest_value): Call release_value_or_incref instead of release_value. diff --git a/gdb/guile/scm-type.c b/gdb/guile/scm-type.c index 4fa0c28..9345c28 100644 --- a/gdb/guile/scm-type.c +++ b/gdb/guile/scm-type.c @@ -363,11 +363,30 @@ tyscm_copy_type_recursive (void **slot, void *info) type_smob *t_smob = (type_smob *) *slot; htab_t copied_types = info; struct objfile *objfile = TYPE_OBJFILE (t_smob->type); + htab_t htab; + eqable_gdb_smob **new_slot; + type_smob t_smob_for_lookup; gdb_assert (objfile != NULL); htab_empty (copied_types); t_smob->type = copy_type_recursive (objfile, t_smob->type, copied_types); + + /* The eq?-hashtab that the type lived in is going away. + Add the type to its new eq?-hashtab: Otherwise if/when the type is later + garbage collected we'll assert-fail if the type isn't in the hashtab. + PR 16612. + + Types now live in "arch space", and things like "char" that came from + the objfile *could* be considered eq? with the arch "char" type. + However, they weren't before the objfile got deleted, so making them + eq? now is debatable. */ + htab = tyscm_type_map (t_smob->type); + t_smob_for_lookup.type = t_smob->type; + new_slot = gdbscm_find_eqable_gsmob_ptr_slot (htab, &t_smob_for_lookup.base); + gdb_assert (*new_slot == NULL); + gdbscm_fill_eqable_gsmob_ptr_slot (new_slot, &t_smob->base); + return 1; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 78be1f7..1ebde9b 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2014-03-13 Doug Evans <xdje42@gmail.com> + + PR guile/16612 + * gdb.guile/scm-value.ep (test_value_after_death): Do a garbage + collect after discarding symbols. + 2014-03-13 Ludovic Courtès <ludo@gnu.org> Doug Evans <xdje42@gmail.com> diff --git a/gdb/testsuite/gdb.guile/scm-value.exp b/gdb/testsuite/gdb.guile/scm-value.exp index a85d5bd..0bcd381 100644 --- a/gdb/testsuite/gdb.guile/scm-value.exp +++ b/gdb/testsuite/gdb.guile/scm-value.exp @@ -286,6 +286,9 @@ proc test_value_after_death {} { "Discard symbol table from.*y or n. $" \ "y" + # First do a garbage collect to delete anything unused. PR 16612. + gdb_scm_test_silent_cmd "gu (gc)" "garbage collect" + # Now create a value using that type. Relies on arg0, created by # test_value_in_inferior. gdb_scm_test_silent_cmd "gu (define castval (value-cast arg0 (type-pointer ptrtype)))" \ |