diff options
author | dehao <dehao@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-09-25 13:19:33 +0000 |
---|---|---|
committer | dehao <dehao@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-09-25 13:19:33 +0000 |
commit | 5c1946c8ac9700d95b38682755166416033f3cb2 (patch) | |
tree | 15300d39cad0dd42a53b5a881a84a683ae95f406 /libcpp | |
parent | 9b69a8dd0f6951dddb8c2764d5fc28c8b4ac3324 (diff) | |
download | gcc-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/ChangeLog | 14 | ||||
-rw-r--r-- | libcpp/include/line-map.h | 14 | ||||
-rw-r--r-- | libcpp/line-map.c | 51 |
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. */ |