#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 =
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;
-
- /* 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));
+ /* We need more space! */
+ if (!num_maps_allocated)
+ num_maps_allocated = 128;
+ num_maps_allocated *= 2;
+
+ 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;
-
- /* 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)];
+ 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
- result = &set->info_ordinary.maps[LINEMAPS_USED (set, macro_map_p)];
+ set->info_ordinary.maps = (line_map_ordinary *)buffer;
+ LINEMAPS_ALLOCATED (set, macro_p) = num_maps;
}
- result->start_location = start_location;
+ 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)++;
- LINEMAPS_USED (set, macro_map_p)++;
+ result->start_location = start_location;
return result;
}