OSDN Git Service

* config/i386/sse.md (xop_pmacsww, xop_pmacssww, xop_pmacsdd,
[pf3gnuchains/gcc-fork.git] / gcc / ggc-common.c
index 2499ff5..76a35f7 100644 (file)
@@ -91,30 +91,59 @@ ggc_htab_delete (void **slot, void *info)
 
 /* This extra vector of dynamically registered root_tab-s is used by
    ggc_mark_roots and gives the ability to dynamically add new GGC root
-   tables, for instance from some plugins; this vector is a heap one
-   [since it is used by GGC internally!] */
-typedef const struct ggc_root_tabconst_ggc_root_tab_t;
+   tables, for instance from some plugins; this vector is on the heap
+   since it is used by GGC internally.  */
+typedef const struct ggc_root_tab *const_ggc_root_tab_t;
 DEF_VEC_P(const_ggc_root_tab_t);
 DEF_VEC_ALLOC_P(const_ggc_root_tab_t, heap);
 static VEC(const_ggc_root_tab_t, heap) *extra_root_vec;
 
-
 /* Dynamically register a new GGC root table RT. This is useful for
    plugins. */
 
 void 
 ggc_register_root_tab (const struct ggc_root_tab* rt)
 {
-  if (!rt)
-    return;
-  if (!extra_root_vec) 
-    {
-      int vlen = 32;
-      extra_root_vec = VEC_alloc (const_ggc_root_tab_t, heap, vlen);
-    }
-  VEC_safe_push (const_ggc_root_tab_t, heap, extra_root_vec, rt);
+  if (rt)
+    VEC_safe_push (const_ggc_root_tab_t, heap, extra_root_vec, rt);
+}
+
+/* This extra vector of dynamically registered cache_tab-s is used by
+   ggc_mark_roots and gives the ability to dynamically add new GGC cache
+   tables, for instance from some plugins; this vector is on the heap
+   since it is used by GGC internally.  */
+typedef const struct ggc_cache_tab *const_ggc_cache_tab_t;
+DEF_VEC_P(const_ggc_cache_tab_t);
+DEF_VEC_ALLOC_P(const_ggc_cache_tab_t, heap);
+static VEC(const_ggc_cache_tab_t, heap) *extra_cache_vec;
+
+/* Dynamically register a new GGC cache table CT. This is useful for
+   plugins. */
+
+void
+ggc_register_cache_tab (const struct ggc_cache_tab* ct)
+{
+  if (ct)
+    VEC_safe_push (const_ggc_cache_tab_t, heap, extra_cache_vec, ct);
 }
 
+/* Scan a hash table that has objects which are to be deleted if they are not
+   already marked.  */
+
+static void
+ggc_scan_cache_tab (const_ggc_cache_tab_t ctp)
+{
+  const struct ggc_cache_tab *cti;
+
+  for (cti = ctp; cti->base != NULL; cti++)
+    if (*cti->base)
+      {
+        ggc_set_mark (*cti->base);
+        htab_traverse_noresize (*cti->base, ggc_htab_delete,
+                                CONST_CAST (void *, (const void *)cti));
+        ggc_set_mark ((*cti->base)->entries);
+      }
+}
 
 /* Iterate through all registered roots and mark each element.  */
 
@@ -123,8 +152,9 @@ ggc_mark_roots (void)
 {
   const struct ggc_root_tab *const *rt;
   const struct ggc_root_tab *rti;
+  const_ggc_root_tab_t rtp;
   const struct ggc_cache_tab *const *ct;
-  const struct ggc_cache_tab *cti;
+  const_ggc_cache_tab_t ctp;
   size_t i;
 
   for (rt = gt_ggc_deletable_rtab; *rt; rt++)
@@ -136,18 +166,11 @@ ggc_mark_roots (void)
       for (i = 0; i < rti->nelt; i++)
        (*rti->cb) (*(void **)((char *)rti->base + rti->stride * i));
 
-  if (extra_root_vec 
-      && VEC_length(const_ggc_root_tab_t,extra_root_vec) > 0)
+  for (i = 0; VEC_iterate (const_ggc_root_tab_t, extra_root_vec, i, rtp); i++)
     {
-      const_ggc_root_tab_t rtp = NULL;
-      for (i=0; 
-          VEC_iterate(const_ggc_root_tab_t, extra_root_vec, i, rtp); 
-          i++) 
-       {
-         for (rti = rtp; rti->base != NULL; rti++)
-           for (i = 0; i < rti->nelt; i++)
-             (*rti->cb) (*(void **) ((char *)rti->base + rti->stride * i));
-       }
+      for (rti = rtp; rti->base != NULL; rti++)
+        for (i = 0; i < rti->nelt; i++)
+          (*rti->cb) (*(void **) ((char *)rti->base + rti->stride * i));
     }
 
   if (ggc_protect_identifiers)
@@ -156,14 +179,10 @@ ggc_mark_roots (void)
   /* Now scan all hash tables that have objects which are to be deleted if
      they are not already marked.  */
   for (ct = gt_ggc_cache_rtab; *ct; ct++)
-    for (cti = *ct; cti->base != NULL; cti++)
-      if (*cti->base)
-       {
-         ggc_set_mark (*cti->base);
-         htab_traverse_noresize (*cti->base, ggc_htab_delete,
-                                 CONST_CAST (void *, (const void *)cti));
-         ggc_set_mark ((*cti->base)->entries);
-       }
+    ggc_scan_cache_tab (*ct);
+
+  for (i = 0; VEC_iterate (const_ggc_cache_tab_t, extra_cache_vec, i, ctp); i++)
+    ggc_scan_cache_tab (ctp);
 
   if (! ggc_protect_identifiers)
     ggc_purge_stringpool ();