summaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authordehao <dehao@138bc75d-0d04-0410-961f-82ee72b054a4>2012-09-25 13:19:33 +0000
committerdehao <dehao@138bc75d-0d04-0410-961f-82ee72b054a4>2012-09-25 13:19:33 +0000
commit5c1946c8ac9700d95b38682755166416033f3cb2 (patch)
tree15300d39cad0dd42a53b5a881a84a683ae95f406 /libcpp
parent9b69a8dd0f6951dddb8c2764d5fc28c8b4ac3324 (diff)
downloadgcc-5c1946c8ac9700d95b38682755166416033f3cb2.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@191706 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libcpp')
-rw-r--r--libcpp/ChangeLog14
-rw-r--r--libcpp/include/line-map.h14
-rw-r--r--libcpp/line-map.c51
3 files changed, 51 insertions, 28 deletions
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index ab0e2ec3c43..76602042582 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -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.
diff --git a/libcpp/include/line-map.h b/libcpp/include/line-map.h
index 86f8383dcd8..5f4bcd780fa 100644
--- a/libcpp/include/line-map.h
+++ b/libcpp/include/line-map.h
@@ -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 *);
diff --git a/libcpp/line-map.c b/libcpp/line-map.c
index 54da4bca8bd..f0b2f8846a5 100644
--- a/libcpp/line-map.c
+++ b/libcpp/line-map.c
@@ -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. */