]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
dbxout.c (output_used_types_helper): Push queued types on a VEC.
authorDaniel Jacobowitz <dan@codesourcery.com>
Tue, 25 Jul 2006 12:31:33 +0000 (12:31 +0000)
committerDaniel Jacobowitz <drow@gcc.gnu.org>
Tue, 25 Jul 2006 12:31:33 +0000 (12:31 +0000)
* dbxout.c (output_used_types_helper): Push queued types
on a VEC.
(output_types_sort): New.
(output_used_types): Collect used types on a VEC and sort them
before emission.

From-SVN: r115735

gcc/ChangeLog
gcc/dbxout.c

index 226a63b86463fd92e52d2c865d3292109bfdd8b3..69a963c04c7c5dc9d0c1d81f183aa6b7bada0bb1 100644 (file)
@@ -1,3 +1,11 @@
+2006-07-25  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * dbxout.c (output_used_types_helper): Push queued types
+       on a VEC.
+       (output_types_sort): New.
+       (output_used_types): Collect used types on a VEC and sort them
+       before emission.
+
 2006-07-24  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/28463
index 0776ad88df7c5334f1d7f568715931747bfdc11e..df8b0aff4533f9e5d7ca577482b6fc4191165c4d 100644 (file)
@@ -2373,9 +2373,10 @@ dbxout_expand_expr (tree expr)
    used types hash to be output.  */
 
 static int
-output_used_types_helper (void **slot, void *data ATTRIBUTE_UNUSED)
+output_used_types_helper (void **slot, void *data)
 {
   tree type = *slot;
+  VEC(tree, heap) **types_p = data;
 
   if ((TREE_CODE (type) == RECORD_TYPE
        || TREE_CODE (type) == UNION_TYPE
@@ -2384,21 +2385,58 @@ output_used_types_helper (void **slot, void *data ATTRIBUTE_UNUSED)
       && TYPE_STUB_DECL (type)
       && DECL_P (TYPE_STUB_DECL (type))
       && ! DECL_IGNORED_P (TYPE_STUB_DECL (type)))
-    debug_queue_symbol (TYPE_STUB_DECL (type));
+    VEC_quick_push (tree, *types_p, TYPE_STUB_DECL (type));
   else if (TYPE_NAME (type)
           && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL)
-    debug_queue_symbol (TYPE_NAME (type));
+    VEC_quick_push (tree, *types_p, TYPE_NAME (type));
 
   return 1;
 }
 
+static int
+output_types_sort (const void *pa, const void *pb)
+{
+  const tree lhs = *((const tree *)pa);
+  const tree rhs = *((const tree *)pb);
+
+  if (TYPE_P (lhs))
+    {
+      if (TYPE_P (rhs))
+       return TYPE_UID (lhs) - TYPE_UID (rhs);
+      else
+       return 1;
+    }
+  else
+    {
+      if (TYPE_P (rhs))
+       return -1;
+      else
+       return DECL_UID (lhs) - DECL_UID (rhs);
+    }
+}
+
+
 /* Force all types used by this function to be output in debug
    information.  */
 static void
 output_used_types (void)
 {
   if (cfun && cfun->used_types_hash)
-    htab_traverse (cfun->used_types_hash, output_used_types_helper, NULL);
+    {
+      VEC(tree, heap) *types;
+      int i;
+      tree type;
+
+      types = VEC_alloc (tree, heap, htab_elements (cfun->used_types_hash));
+      htab_traverse (cfun->used_types_hash, output_used_types_helper, &types);
+
+      /* Sort by UID to prevent dependence on hash table ordering.  */
+      qsort (VEC_address (tree, types), VEC_length (tree, types),
+            sizeof (tree), output_types_sort);
+
+      for (i = 0; VEC_iterate (tree, types, i, type); i++)
+       debug_queue_symbol (type);
+    }
 }
 
 /* Output a .stabs for the symbol defined by DECL,