]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/54645 (Many testsuite failures)
authorDehao Chen <dehao@google.com>
Tue, 25 Sep 2012 13:19:33 +0000 (13:19 +0000)
committerDehao Chen <dehao@gcc.gnu.org>
Tue, 25 Sep 2012 13:19:33 +0000 (13:19 +0000)
gcc:
2012-09-25  Dehao Chen  <dehao@google.com>

PR middle-end/54645
* c-family/c-pch.c (c_common_read_pch): Rebuild the location_adhoc_data
map when read in the pch.

libcpp:
2012-09-25  Dehao Chen  <dehao@google.com>

PR middle-end/54645
* include/line-map.h (location_adhoc_data): Move location_adhoc_data
into GC.
(location_adhoc_data_map): Likewise.
(line_maps): Likewise.
(rebuild_location_adhoc_htab): New Function.
* line-map.c (+rebuild_location_adhoc_htab): new Funcion.
(get_combined_adhoc_loc): Move location_adhoc_data into GC.
(location_adhoc_data_fini): Likewise.
(linemap_init): Likewise.
(location_adhoc_data_init): Remove Function.

From-SVN: r191706

gcc/ChangeLog
gcc/c-family/c-pch.c
libcpp/ChangeLog
libcpp/include/line-map.h
libcpp/line-map.c

index df7ab16a2b3435c9cfaea4cef6a19febd7da4e5d..61134bdb6b24b69c9a31a1dc47323c631d640502 100644 (file)
@@ -1,3 +1,9 @@
+2012-09-25  Dehao Chen  <dehao@google.com>
+
+       PR middle-end/54645
+       * c-family/c-pch.c (c_common_read_pch): Rebuild the location_adhoc_data
+       map when read in the pch.
+
 2012-09-25  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/54676
index 3a588f08b398375248ae4b28424a3b84ed987711..b239ed4f3434a9c9c1bb864cefd630ef55b444fd 100644 (file)
@@ -340,6 +340,7 @@ c_common_read_pch (cpp_reader *pfile, const char *name,
 
   gt_pch_restore (f);
   cpp_set_line_map (pfile, line_table);
+  rebuild_location_adhoc_htab (line_table);
 
   timevar_push (TV_PCH_CPP_RESTORE);
   if (cpp_read_state (pfile, name, f, smd) != 0)
index ab0e2ec3c4310d50feb0fe33befd019e0d559842..76602042582e8b0b218b6905611b1488f1177ca7 100644 (file)
@@ -1,3 +1,17 @@
+2012-09-25  Dehao Chen  <dehao@google.com>
+
+       PR middle-end/54645
+       * include/line-map.h (location_adhoc_data): Move location_adhoc_data
+       into GC.
+       (location_adhoc_data_map): Likewise.
+       (line_maps): Likewise.
+       (rebuild_location_adhoc_htab): New Function.
+       * line-map.c (+rebuild_location_adhoc_htab): new Funcion.
+       (get_combined_adhoc_loc): Move location_adhoc_data into GC.
+       (location_adhoc_data_fini): Likewise.
+       (linemap_init): Likewise.
+       (location_adhoc_data_init): Remove Function.
+
 2012-09-19  Dehao Chen  <dehao@google.com>
 
        * include/line-map.h (MAX_SOURCE_LOCATION): New value.
index 86f8383dcd8d74bd0ce3f76883726e5ad2929879..5f4bcd780fa64c330ec8781014666f849092302b 100644 (file)
@@ -260,9 +260,9 @@ struct GTY(()) maps_info {
 };
 
 /* Data structure to associate an arbitrary data to a source location.  */
-struct location_adhoc_data {
+struct GTY(()) location_adhoc_data {
   source_location locus;
-  void *data;
+  void * GTY((skip)) data;
 };
 
 struct htab;
@@ -277,11 +277,11 @@ struct htab;
    bits of the integer is used to index the location_adhoc_data array,
    in which the locus and associated data is stored.  */
 
-struct location_adhoc_data_map {
-  struct htab *htab;
+struct GTY(()) location_adhoc_data_map {
+  struct htab * GTY((skip)) htab;
   source_location curr_loc;
-  struct location_adhoc_data *data;
   unsigned int allocated;
+  struct location_adhoc_data GTY((length ("%h.allocated"))) *data;
 };
 
 /* A set of chronological line_map structures.  */
@@ -315,7 +315,7 @@ struct GTY(()) line_maps {
      allocated, for a certain allocation size requested.  */
   line_map_round_alloc_size_func round_alloc_size;
 
-  struct location_adhoc_data_map GTY((skip)) location_adhoc_data_map;
+  struct location_adhoc_data_map location_adhoc_data_map;
 };
 
 /* Returns the pointer to the memory region where information about
@@ -446,6 +446,8 @@ extern source_location get_location_from_adhoc_loc (struct line_maps *,
 #define COMBINE_LOCATION_DATA(SET, LOC, BLOCK) \
   get_combined_adhoc_loc ((SET), (LOC), (BLOCK))
 
+extern void rebuild_location_adhoc_htab (struct line_maps *);
+
 /* Initialize a line map set.  */
 extern void linemap_init (struct line_maps *);
 
index 54da4bca8bd56fb6ffe5cd5978c286152a8b3d35..f0b2f8846a56f22f091294580e1cd1671da79527 100644 (file)
@@ -82,6 +82,19 @@ location_adhoc_data_update (void **slot, void *data)
   return 1;
 }
 
+/* Rebuild the hash table from the location adhoc data.  */
+
+void
+rebuild_location_adhoc_htab (struct line_maps *set)
+{
+  unsigned i;
+  set->location_adhoc_data_map.htab =
+      htab_create (100, location_adhoc_data_hash, location_adhoc_data_eq, NULL);
+  for (i = 0; i < set->location_adhoc_data_map.curr_loc; i++)
+    htab_find_slot (set->location_adhoc_data_map.htab,
+                   set->location_adhoc_data_map.data + i, INSERT);
+}
+
 /* Combine LOCUS and DATA to a combined adhoc loc.  */
 
 source_location
@@ -109,14 +122,21 @@ get_combined_adhoc_loc (struct line_maps *set,
        {
          char *orig_data = (char *) set->location_adhoc_data_map.data;
          long long offset;
-         set->location_adhoc_data_map.allocated *= 2;
-         set->location_adhoc_data_map.data =
-             XRESIZEVEC (struct location_adhoc_data,
-                         set->location_adhoc_data_map.data,
-                         set->location_adhoc_data_map.allocated);
+         line_map_realloc reallocator
+             = set->reallocator ? set->reallocator : xrealloc;
+
+         if (set->location_adhoc_data_map.allocated == 0)
+           set->location_adhoc_data_map.allocated = 128;
+         else
+           set->location_adhoc_data_map.allocated *= 2;
+         set->location_adhoc_data_map.data = (struct location_adhoc_data *)
+             reallocator (set->location_adhoc_data_map.data,
+                          set->location_adhoc_data_map.allocated
+                          * sizeof (struct location_adhoc_data));
          offset = (char *) (set->location_adhoc_data_map.data) - orig_data;
-         htab_traverse (set->location_adhoc_data_map.htab,
-                        location_adhoc_data_update, &offset);
+         if (set->location_adhoc_data_map.allocated > 128)
+           htab_traverse (set->location_adhoc_data_map.htab,
+                          location_adhoc_data_update, &offset);
        }
       *slot = set->location_adhoc_data_map.data
              + set->location_adhoc_data_map.curr_loc;
@@ -144,24 +164,10 @@ get_location_from_adhoc_loc (struct line_maps *set, source_location loc)
   return set->location_adhoc_data_map.data[loc & MAX_SOURCE_LOCATION].locus;
 }
 
-/* Initialize the location_adhoc_data structure.  */
-
-static void
-location_adhoc_data_init (struct line_maps *set)
-{
-  set->location_adhoc_data_map.htab =
-      htab_create (100, location_adhoc_data_hash, location_adhoc_data_eq, NULL);
-  set->location_adhoc_data_map.curr_loc = 0;
-  set->location_adhoc_data_map.allocated = 100;
-  set->location_adhoc_data_map.data = XNEWVEC (struct location_adhoc_data, 100);
-}
-
 /* Finalize the location_adhoc_data structure.  */
 void
 location_adhoc_data_fini (struct line_maps *set)
 {
-  set->location_adhoc_data_map.allocated = 0;
-  XDELETEVEC (set->location_adhoc_data_map.data);
   htab_delete (set->location_adhoc_data_map.htab);
 }
 
@@ -173,7 +179,8 @@ linemap_init (struct line_maps *set)
   memset (set, 0, sizeof (struct line_maps));
   set->highest_location = RESERVED_LOCATION_COUNT - 1;
   set->highest_line = RESERVED_LOCATION_COUNT - 1;
-  location_adhoc_data_init (set);
+  set->location_adhoc_data_map.htab =
+      htab_create (100, location_adhoc_data_hash, location_adhoc_data_eq, NULL);
 }
 
 /* Check for and warn about line_maps entered but not exited.  */