[PATCH] Line map table allocation
https://gcc.gnu.org/ml/gcc-patches/2018-08/msg00434.html * line-map.c: (linemap_init): Set default allocator here. (new_linemap): Rather than here. Refactor allocation logic. From-SVN: r263366
This commit is contained in:
parent
0ec78a9369
commit
e81c3c4dc1
2 changed files with 45 additions and 60 deletions
|
@ -1,3 +1,8 @@
|
|||
2018-08-07 Nathan Sidwell <nathan@acm.org>
|
||||
|
||||
* line-map.c: (linemap_init): Set default allocator here.
|
||||
(new_linemap): Rather than here. Refactor allocation logic.
|
||||
|
||||
2018-07-20 David Malcolm <dmalcolm@redhat.com>
|
||||
|
||||
* include/line-map.h (rich_location::set_range): Remove redundant
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue