2013-06-10 Cary Coutant <ccoutant@google.com>
authorccoutant <ccoutant@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 Jun 2013 23:48:41 +0000 (23:48 +0000)
committerccoutant <ccoutant@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 Jun 2013 23:48:41 +0000 (23:48 +0000)
gcc/
* dwarf2out.c (hash_external_ref): Use die_symbol or signature
for hash so that hash table traversal order is deterministic.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@199927 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/dwarf2out.c

index 77bd5e6..703428a 100644 (file)
@@ -1,3 +1,8 @@
+2013-06-10  Cary Coutant  <ccoutant@google.com>
+
+       * dwarf2out.c (hash_external_ref): Use die_symbol or signature
+       for hash so that hash table traversal order is deterministic.
+
 2013-06-10  Michael Meissner  <meissner@linux.vnet.ibm.com>
            Pat Haugen <pthaugen@us.ibm.com>
            Peter Bergner <bergner@vnet.ibm.com>
index b615b18..f42ad66 100644 (file)
@@ -7388,7 +7388,22 @@ struct external_ref_hasher : typed_free_remove <external_ref>
 inline hashval_t
 external_ref_hasher::hash (const value_type *r)
 {
-  return htab_hash_pointer (r->type);
+  dw_die_ref die = r->type;
+  hashval_t h = 0;
+
+  /* We can't use the address of the DIE for hashing, because
+     that will make the order of the stub DIEs non-deterministic.  */
+  if (! die->comdat_type_p)
+    /* We have a symbol; use it to compute a hash.  */
+    h = htab_hash_string (die->die_id.die_symbol);
+  else
+    {
+      /* We have a type signature; use a subset of the bits as the hash.
+        The 8-byte signature is at least as large as hashval_t.  */
+      comdat_type_node_ref type_node = die->die_id.die_type_node;
+      memcpy (&h, type_node->signature, sizeof (h));
+    }
+  return h;
 }
 
 inline bool