diff options
author | Dehao Chen <dehao@google.com> | 2012-09-25 13:19:33 +0000 |
---|---|---|
committer | Dehao Chen <dehao@gcc.gnu.org> | 2012-09-25 13:19:33 +0000 |
commit | 521870087489ac8cdd3aa6c660b641c9285848d5 (patch) | |
tree | 15300d39cad0dd42a53b5a881a84a683ae95f406 /libcpp/line-map.c | |
parent | c1301f602711e6397326084efef1516a194c9e84 (diff) | |
download | gcc-521870087489ac8cdd3aa6c660b641c9285848d5.zip gcc-521870087489ac8cdd3aa6c660b641c9285848d5.tar.gz gcc-521870087489ac8cdd3aa6c660b641c9285848d5.tar.bz2 |
re PR middle-end/54645 (Many testsuite failures)
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
Diffstat (limited to 'libcpp/line-map.c')
-rw-r--r-- | libcpp/line-map.c | 51 |
1 files changed, 29 insertions, 22 deletions
diff --git a/libcpp/line-map.c b/libcpp/line-map.c index 54da4bc..f0b2f88 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. */ |