Commit 9132fbb7 by Per Bothner Committed by Per Bothner

Implement a cache for linemap_lookup.

	* line-map.h (struct_line_maps):  Add cache field.
	* line-map.c (linemap_init):  Zero cache field.
	(linemap_add):  Set cache field to offset of newly allocated map.
	(linemap_lookup):  Use and set cache field.

From-SVN: r76197
parent 26d107db
2003-01-20 Per Bothner <pbothner@apple.com>
Implement a cache for linemap_lookup.
* line-map.h (struct_line_maps): Add cache field.
* line-map.c (linemap_init): Zero cache field.
(linemap_add): Set cache field to offset of newly allocated map.
(linemap_lookup): Use and set cache field.
2004-01-20 Kaz Kojima <kkojima@gcc.gnu.org> 2004-01-20 Kaz Kojima <kkojima@gcc.gnu.org>
PR optimization/13567 PR optimization/13567
......
...@@ -32,12 +32,13 @@ static void trace_include (const struct line_maps *, const struct line_map *); ...@@ -32,12 +32,13 @@ static void trace_include (const struct line_maps *, const struct line_map *);
void void
linemap_init (struct line_maps *set) linemap_init (struct line_maps *set)
{ {
set->maps = 0; set->maps = NULL;
set->allocated = 0; set->allocated = 0;
set->used = 0; set->used = 0;
set->last_listed = -1; set->last_listed = -1;
set->trace_includes = false; set->trace_includes = false;
set->depth = 0; set->depth = 0;
set->cache = 0;
} }
/* Free a line map set. */ /* Free a line map set. */
...@@ -89,7 +90,7 @@ linemap_add (struct line_maps *set, enum lc_reason reason, ...@@ -89,7 +90,7 @@ linemap_add (struct line_maps *set, enum lc_reason reason,
set->maps = xrealloc (set->maps, set->allocated * sizeof (struct line_map)); set->maps = xrealloc (set->maps, set->allocated * sizeof (struct line_map));
} }
map = &set->maps[set->used++]; map = &set->maps[set->used];
if (to_file && *to_file == '\0') if (to_file && *to_file == '\0')
to_file = "<stdin>"; to_file = "<stdin>";
...@@ -108,7 +109,6 @@ linemap_add (struct line_maps *set, enum lc_reason reason, ...@@ -108,7 +109,6 @@ linemap_add (struct line_maps *set, enum lc_reason reason,
if (to_file == NULL) if (to_file == NULL)
{ {
set->depth--; set->depth--;
set->used--;
return NULL; return NULL;
} }
error = true; error = true;
...@@ -141,6 +141,7 @@ linemap_add (struct line_maps *set, enum lc_reason reason, ...@@ -141,6 +141,7 @@ linemap_add (struct line_maps *set, enum lc_reason reason,
map->from_line = from_line; map->from_line = from_line;
map->to_file = to_file; map->to_file = to_file;
map->to_line = to_line; map->to_line = to_line;
set->cache = set->used++;
if (reason == LC_ENTER) if (reason == LC_ENTER)
{ {
...@@ -168,10 +169,24 @@ linemap_add (struct line_maps *set, enum lc_reason reason, ...@@ -168,10 +169,24 @@ linemap_add (struct line_maps *set, enum lc_reason reason,
const struct line_map * const struct line_map *
linemap_lookup (struct line_maps *set, source_location line) linemap_lookup (struct line_maps *set, source_location line)
{ {
unsigned int md, mn = 0, mx = set->used; unsigned int md, mn, mx;
const struct line_map *cached;
if (mx == 0)
abort (); mn = set->cache;
mx = set->used;
cached = &set->maps[mn];
/* We should get a segfault if no line_maps have been added yet. */
if (line >= cached->from_line)
{
if (mn + 1 == mx || line < cached[1].from_line)
return cached;
}
else
{
mx = mn;
mn = 0;
}
while (mx - mn > 1) while (mx - mn > 1)
{ {
...@@ -182,6 +197,7 @@ linemap_lookup (struct line_maps *set, source_location line) ...@@ -182,6 +197,7 @@ linemap_lookup (struct line_maps *set, source_location line)
mn = md; mn = md;
} }
set->cache = mn;
return &set->maps[mn]; return &set->maps[mn];
} }
......
...@@ -61,6 +61,8 @@ struct line_maps ...@@ -61,6 +61,8 @@ struct line_maps
unsigned int allocated; unsigned int allocated;
unsigned int used; unsigned int used;
unsigned int cache;
/* The most recently listed include stack, if any, starts with /* The most recently listed include stack, if any, starts with
LAST_LISTED as the topmost including file. -1 indicates nothing LAST_LISTED as the topmost including file. -1 indicates nothing
has been listed yet. */ has been listed yet. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment