diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index c72804f2cb0..50fa2535888 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,8 @@ +2018-08-07 Nathan Sidwell + + * line-map.c: (linemap_init): Set default allocator here. + (new_linemap): Rather than here. Refactor allocation logic. + 2018-07-20 David Malcolm * include/line-map.h (rich_location::set_range): Remove redundant diff --git a/libcpp/line-map.c b/libcpp/line-map.c index a1a765f14fd..a5dc485e79e 100644 --- a/libcpp/line-map.c +++ b/libcpp/line-map.c @@ -346,6 +346,8 @@ linemap_init (struct line_maps *set, #else new (set) line_maps(); #endif + /* Set default reallocator (used for initial alloc too). */ + set->reallocator = xrealloc; set->highest_location = RESERVED_LOCATION_COUNT - 1; set->highest_line = RESERVED_LOCATION_COUNT - 1; set->location_adhoc_data_map.htab = @@ -376,82 +378,60 @@ linemap_check_files_exited (struct line_maps *set) static struct line_map * new_linemap (struct line_maps *set, source_location start_location) { - struct line_map *result; - bool macro_map_p = start_location >= LINE_MAP_MAX_LOCATION; + bool macro_p = start_location >= LINE_MAP_MAX_LOCATION; + unsigned num_maps_allocated = LINEMAPS_ALLOCATED (set, macro_p); + unsigned num_maps_used = LINEMAPS_USED (set, macro_p); - if (LINEMAPS_USED (set, macro_map_p) == LINEMAPS_ALLOCATED (set, macro_map_p)) + if (num_maps_used == num_maps_allocated) { - /* We ran out of allocated line maps. Let's allocate more. */ - size_t alloc_size; + /* We need more space! */ + if (!num_maps_allocated) + num_maps_allocated = 128; + num_maps_allocated *= 2; - /* Cast away extern "C" from the type of xrealloc. */ - line_map_realloc reallocator = (set->reallocator - ? set->reallocator - : (line_map_realloc) xrealloc); - line_map_round_alloc_size_func round_alloc_size = - set->round_alloc_size; - - size_t map_size = (macro_map_p - ? sizeof (line_map_macro) - : sizeof (line_map_ordinary)); + size_t size_of_a_map; + void *buffer; + if (macro_p) + { + size_of_a_map = sizeof (line_map_macro); + buffer = set->info_macro.maps; + } + else + { + size_of_a_map = sizeof (line_map_ordinary); + buffer = set->info_ordinary.maps; + } /* We are going to execute some dance to try to reduce the overhead of the memory allocator, in case we are using the ggc-page.c one. The actual size of memory we are going to get back from the - allocator is the smallest power of 2 that is greater than the - size we requested. So let's consider that size then. */ - - alloc_size = - (2 * LINEMAPS_ALLOCATED (set, macro_map_p) + 256) - * map_size; - - /* Get the actual size of memory that is going to be allocated - by the allocator. */ - alloc_size = round_alloc_size (alloc_size); + allocator may well be larger than what we ask for. Use this + hook to find what that size is. */ + size_t alloc_size + = set->round_alloc_size (num_maps_allocated * size_of_a_map); /* Now alloc_size contains the exact memory size we would get if we have asked for the initial alloc_size amount of memory. - Let's get back to the number of macro map that amounts - to. */ - LINEMAPS_ALLOCATED (set, macro_map_p) = - alloc_size / map_size; + Let's get back to the number of map that amounts to. */ + unsigned num_maps = alloc_size / size_of_a_map; + buffer = set->reallocator (buffer, num_maps * size_of_a_map); + memset ((char *)buffer + num_maps_used * size_of_a_map, 0, + (num_maps - num_maps_used) * size_of_a_map); + if (macro_p) + set->info_macro.maps = (line_map_macro *)buffer; + else + set->info_ordinary.maps = (line_map_ordinary *)buffer; + LINEMAPS_ALLOCATED (set, macro_p) = num_maps; + } - /* And now let's really do the re-allocation. */ - if (macro_map_p) - { - set->info_macro.maps - = (line_map_macro *) (*reallocator) (set->info_macro.maps, - (LINEMAPS_ALLOCATED (set, macro_map_p) - * map_size)); - result = &set->info_macro.maps[LINEMAPS_USED (set, macro_map_p)]; - } - else - { - set->info_ordinary.maps = - (line_map_ordinary *) (*reallocator) (set->info_ordinary.maps, - (LINEMAPS_ALLOCATED (set, macro_map_p) - * map_size)); - result = &set->info_ordinary.maps[LINEMAPS_USED (set, macro_map_p)]; - } - memset (result, 0, - ((LINEMAPS_ALLOCATED (set, macro_map_p) - - LINEMAPS_USED (set, macro_map_p)) - * map_size)); - } - else - { - if (macro_map_p) - result = &set->info_macro.maps[LINEMAPS_USED (set, macro_map_p)]; - else - result = &set->info_ordinary.maps[LINEMAPS_USED (set, macro_map_p)]; - } + line_map *result = (macro_p ? (line_map *)&set->info_macro.maps[num_maps_used] + : (line_map *)&set->info_ordinary.maps[num_maps_used]); + LINEMAPS_USED (set, macro_p)++; result->start_location = start_location; - LINEMAPS_USED (set, macro_map_p)++; - return result; }