Remove class cache_map and use ggc hash_maps instead (PR c++/70452)
authorPatrick Palka <ppalka@gcc.gnu.org>
Tue, 5 Apr 2016 01:20:00 +0000 (01:20 +0000)
committerPatrick Palka <ppalka@gcc.gnu.org>
Tue, 5 Apr 2016 01:20:00 +0000 (01:20 +0000)
gcc/cp/ChangeLog:

PR c++/70452
* cp-tree.h (class cache_map): Remove.
* constexpr.c (cv_cache): Change type to
GTY((deletable)) hash_map<tree, tree> *.
(maybe_constant_value): Adjust following the change to cv_cache.
(clear_cv_cache): New static function.
(clear_cv_and_fold_caches): Use it.
* cp-gimplify.c (fold_cache): Change type to
GTY((deletable)) hash_map<tree, tree> *.
(clear_fold_cache): Adjust following the change to fold_cache.
(cp_fold): Likewise.

From-SVN: r234732

gcc/cp/ChangeLog
gcc/cp/constexpr.c
gcc/cp/cp-gimplify.c
gcc/cp/cp-tree.h

index 524f6636860b14184dd705c73ab320bec3cb9830..77ac83db02fee1ab051e1cac8c7ca581c0272654 100644 (file)
@@ -1,3 +1,17 @@
+2016-04-05  Patrick Palka  <ppalka@gcc.gnu.org>
+
+       PR c++/70452
+       * cp-tree.h (class cache_map): Remove.
+       * constexpr.c (cv_cache): Change type to
+       GTY((deletable)) hash_map<tree, tree> *.
+       (maybe_constant_value): Adjust following the change to cv_cache.
+       (clear_cv_cache): New static function.
+       (clear_cv_and_fold_caches): Use it.
+       * cp-gimplify.c (fold_cache): Change type to
+       GTY((deletable)) hash_map<tree, tree> *.
+       (clear_fold_cache): Adjust following the change to fold_cache.
+       (cp_fold): Likewise.
+
 2016-04-02  Martin Sebor  <msebor@redhat.com>
 
        PR c++/67376
index b94b346c45c1f6198165c6cb3dc332721b2508b8..0607b08860cf28f24a5f4832ec7a9af1ae235fd7 100644 (file)
@@ -4215,7 +4215,7 @@ maybe_constant_value_1 (tree t, tree decl)
   return r;
 }
 
-static GTY((cache, deletable)) cache_map cv_cache;
+static GTY((deletable)) hash_map<tree, tree> *cv_cache;
 
 /* If T is a constant expression, returns its reduced value.
    Otherwise, if T does not have TREE_CONSTANT set, returns T.
@@ -4224,21 +4224,32 @@ static GTY((cache, deletable)) cache_map cv_cache;
 tree
 maybe_constant_value (tree t, tree decl)
 {
-  tree ret = cv_cache.get (t);
-  if (!ret)
-    {
-      ret = maybe_constant_value_1 (t, decl);
-      cv_cache.put (t, ret);
-    }
+  if (cv_cache == NULL)
+    cv_cache = hash_map<tree, tree>::create_ggc (101);
+
+  if (tree *cached = cv_cache->get (t))
+    return *cached;
+
+  tree ret = maybe_constant_value_1 (t, decl);
+  cv_cache->put (t, ret);
   return ret;
 }
 
+/* Dispose of the whole CV_CACHE.  */
+
+static void
+clear_cv_cache (void)
+{
+  if (cv_cache != NULL)
+    cv_cache->empty ();
+}
+
 /* Dispose of the whole CV_CACHE and FOLD_CACHE.  */
 
 void
 clear_cv_and_fold_caches (void)
 {
-  gt_cleare_cache (cv_cache);
+  clear_cv_cache ();
   clear_fold_cache ();
 }
 
index 90b3464e5de77831e348a852459dba5bae47d948..13f7b7ccbd7666e4f9c6c8f5c257a018e909bacb 100644 (file)
@@ -1905,14 +1905,15 @@ c_fully_fold (tree x, bool /*in_init*/, bool */*maybe_const*/)
   return cp_fold_rvalue (x);
 }
 
-static GTY((cache, deletable)) cache_map fold_cache;
+static GTY((deletable)) hash_map<tree, tree> *fold_cache;
 
 /* Dispose of the whole FOLD_CACHE.  */
 
 void
 clear_fold_cache (void)
 {
-  gt_cleare_cache (fold_cache);
+  if (fold_cache != NULL)
+    fold_cache->empty ();
 }
 
 /*  This function tries to fold an expression X.
@@ -1942,8 +1943,11 @@ cp_fold (tree x)
   if (DECL_P (x) || CONSTANT_CLASS_P (x))
     return x;
 
-  if (tree cached = fold_cache.get (x))
-    return cached;
+  if (fold_cache == NULL)
+    fold_cache = hash_map<tree, tree>::create_ggc (101);
+
+  if (tree *cached = fold_cache->get (x))
+    return *cached;
 
   code = TREE_CODE (x);
   switch (code)
@@ -2298,10 +2302,10 @@ cp_fold (tree x)
       return org_x;
     }
 
-  fold_cache.put (org_x, x);
+  fold_cache->put (org_x, x);
   /* Prevent that we try to fold an already folded result again.  */
   if (x != org_x)
-    fold_cache.put (x, x);
+    fold_cache->put (x, x);
 
   return x;
 }
index b7b770f920085faf8db8f6c481df52f9ac227c75..d2bf717ae63bcf87a5ac506735ac3f936c1ecef5 100644 (file)
@@ -5525,42 +5525,6 @@ extern cp_parameter_declarator *no_parameters;
 /* True if we saw "#pragma GCC java_exceptions".  */
 extern bool pragma_java_exceptions;
 
-/* Data structure for a mapping from tree to tree that's only used as a cache;
-   we don't GC-mark trees in the map, and we clear the map when collecting
-   garbage.  Global variables of this type must be marked
-   GTY((cache,deletable)) so that the gt_cleare_cache function is called by
-   ggc_collect but we don't try to load the map pointer from a PCH.
-
-   FIXME improve to use keep_cache_entry.  */
-class cache_map
-{
-  /* Use a lazily initialized pointer rather than a map member since a
-     hash_map can't be constructed in a static initializer.  */
-  hash_map<tree, tree> *map;
-
-public:
-  tree get (tree key)
-  {
-    if (map)
-      if (tree *slot = map->get (key))
-       return *slot;
-    return NULL_TREE;
-  }
-
-  bool put (tree key, tree val)
-  {
-    if (!map)
-      map = new hash_map<tree, tree>;
-    return map->put (key, val);
-  }
-
-  friend inline void gt_cleare_cache (cache_map &cm)
-  {
-    if (cm.map)
-      cm.map->empty();
-  }
-};
-
 /* in call.c */
 extern bool check_dtor_name                    (tree, tree);
 int magic_varargs_p                            (tree);