Fix pr 16612.
authorDoug Evans <xdje42@gmail.com>
Thu, 13 Mar 2014 16:55:12 +0000 (09:55 -0700)
committerDoug Evans <xdje42@gmail.com>
Thu, 13 Mar 2014 16:55:12 +0000 (09:55 -0700)
* guile/scm-type.c (tyscm_copy_type_recursive): Move type to its
new eq?-hashtab.

testsuite/
* gdb.guile/scm-value.ep (test_value_after_death): Do a garbage
collect after discarding symbols.

gdb/ChangeLog
gdb/guile/scm-type.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.guile/scm-value.exp

index f997cd649e0dce6bd4cc350010780860a28ad3a5..67cc7ddf1356dd309fe5872d292e76bbec4e6e22 100644 (file)
@@ -1,3 +1,9 @@
+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
index 4fa0c28ed87f7937578eb0bebf60e8fc93049fec..9345c2845f2d84563fec4f47c3f2050e3e990b8e 100644 (file)
@@ -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;
 }
 
index 78be1f75333503f7413337ecec17da100cf49efe..1ebde9b5805b7f398565fd39fb156eeea571efb0 100644 (file)
@@ -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>
 
index a85d5bda9e48e358da37edfe7432b12b1255d4a4..0bcd3816c626fdfc7c47bfc158d5313a02ee478f 100644 (file)
@@ -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)))" \