diff options
author | Dodji Seketeli <dodji@redhat.com> | 2011-10-25 08:58:54 +0000 |
---|---|---|
committer | Dodji Seketeli <dodji@gcc.gnu.org> | 2011-10-25 10:58:54 +0200 |
commit | 84756fd40adc5ceb732dccc84056e08d3ef0186d (patch) | |
tree | 9772bc60a136c3ea7e6977711cf51d5fb4469798 | |
parent | ae5f5715d62c096065139a40cc91e4acfc070c8c (diff) | |
download | gcc-84756fd40adc5ceb732dccc84056e08d3ef0186d.zip gcc-84756fd40adc5ceb732dccc84056e08d3ef0186d.tar.gz gcc-84756fd40adc5ceb732dccc84056e08d3ef0186d.tar.bz2 |
Support expansion of reserved locations wrapped in virtual locations
libcpp/
* include/line-map.h (linemap_expand_location): Take a line table
parameter. Update comment.
(linemap_resolve_location): Update comment.
(linemap_expand_location_full): Remove.
* line-map.c (linemap_resolve_location): Handle reserved
locations; return a NULL map in those cases.
(linemap_expand_location): If location is reserved, return a
zeroed expanded location. Update comment. Take a line table to
assert that the function takes non-virtual locations only.
(linemap_expand_location_full): remove.
(linemap_dump_location): Handle the fact that
linemap_resolve_location can return NULL line maps when the
location resolves to a reserved location.
gcc/
* input.c (expand_location): Rewrite using
linemap_resolve_location and linemap_expand_location. Add a
comment.
From-SVN: r180426
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/input.c | 21 | ||||
-rw-r--r-- | libcpp/ChangeLog | 18 | ||||
-rw-r--r-- | libcpp/include/line-map.h | 21 | ||||
-rw-r--r-- | libcpp/line-map.c | 109 |
5 files changed, 111 insertions, 64 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 77ab424..1788d6a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-10-24 Dodji Seketeli <dodji@redhat.com> + + * input.c (expand_location): Rewrite using + linemap_resolve_location and linemap_expand_location. Add a + comment. + 2011-10-25 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/50596 diff --git a/gcc/input.c b/gcc/input.c index a780f5c..4077f9e 100644 --- a/gcc/input.c +++ b/gcc/input.c @@ -30,20 +30,23 @@ location_t input_location; struct line_maps *line_table; +/* Expand the source location LOC into a human readable location. If + LOC resolves to a builtin location, the file name of the readable + location is set to the string "<built-in>". */ + expanded_location expand_location (source_location loc) { expanded_location xloc; + const struct line_map *map; + + loc = linemap_resolve_location (line_table, loc, + LRK_SPELLING_LOCATION, &map); + xloc = linemap_expand_location (line_table, map, loc); + if (loc <= BUILTINS_LOCATION) - { - xloc.file = loc == UNKNOWN_LOCATION ? NULL : _("<built-in>"); - xloc.line = 0; - xloc.column = 0; - xloc.sysp = 0; - } - else - xloc = linemap_expand_location_full (line_table, loc, - LRK_SPELLING_LOCATION); + xloc.file = loc == UNKNOWN_LOCATION ? NULL : _("<built-in>"); + return xloc; } diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 3c47795..d7fb84f 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,21 @@ +2011-10-24 Dodji Seketeli <dodji@redhat.com> + + * include/line-map.h (linemap_expand_location): Take a line table + parameter. Update comment. + (linemap_resolve_location): Update comment. + (linemap_expand_location_full): Remove. + * line-map.c (linemap_resolve_location): Handle reserved + locations; return a NULL map in those cases. + (linemap_expand_location): If location is reserved, return a + zeroed expanded location. Update comment. Take a line table to + assert that the function takes non-virtual locations only. + (linemap_expand_location_full): remove. + (linemap_dump_location): Handle the fact that + linemap_resolve_location can return NULL line maps when the + location resolves to a reserved location. + + * line-map.c (linemap_macro_map_lookup): Fix logic. + 2011-10-22 Dodji Seketeli <dodji@redhat.com> PR bootstrap/50778 diff --git a/libcpp/include/line-map.h b/libcpp/include/line-map.h index ef98f59..112bc02 100644 --- a/libcpp/include/line-map.h +++ b/libcpp/include/line-map.h @@ -651,7 +651,10 @@ enum location_resolution_kind LRK_SPELLING_LOCATION. If LOC_MAP is not NULL, *LOC_MAP is set to the map encoding the - returned location. */ + returned location. Note that if the resturned location wasn't originally + encoded by a map, the *MAP is set to NULL. This can happen if LOC + resolves to a location reserved for the client code, like + UNKNOWN_LOCATION or BUILTINS_LOCATION in GCC. */ source_location linemap_resolve_location (struct line_maps *, source_location loc, @@ -670,19 +673,13 @@ source_location linemap_unwind_toward_expansion (struct line_maps *, const struct line_map **loc_map); /* Expand source code location LOC and return a user readable source - code location. LOC must be a spelling (non-virtual) location. */ - -expanded_location linemap_expand_location (const struct line_map *, + code location. LOC must be a spelling (non-virtual) location. If + it's a location < RESERVED_LOCATION_COUNT a zeroed expanded source + location is returned. */ +expanded_location linemap_expand_location (struct line_maps *, + const struct line_map *, source_location loc); -/* Expand source code location LOC and return a user readable source - code location. LOC can be a virtual location. The LRK parameter - is the same as for linemap_resolve_location. */ - -expanded_location linemap_expand_location_full (struct line_maps *, - source_location loc, - enum location_resolution_kind lrk); - /* Statistics about maps allocation and usage as returned by linemap_get_statistics. */ struct linemap_stats diff --git a/libcpp/line-map.c b/libcpp/line-map.c index fb3be3a..7a1decc 100644 --- a/libcpp/line-map.c +++ b/libcpp/line-map.c @@ -755,12 +755,12 @@ linemap_location_in_system_header_p (struct line_maps *set, { const struct line_map *map = NULL; - if (location < RESERVED_LOCATION_COUNT) - return false; - location = linemap_resolve_location (set, location, LRK_SPELLING_LOCATION, &map); + if (location < RESERVED_LOCATION_COUNT) + return false; + return LINEMAP_SYSP (map); } @@ -1039,7 +1039,10 @@ linemap_macro_loc_to_exp_point (struct line_maps *set, LRK_SPELLING_LOCATION. If MAP is non-NULL, *MAP is set to the map of the resolved - location. */ + location. Note that if the resturned location wasn't originally + encoded by a map, the *MAP is set to NULL. This can happen if LOC + resolves to a location reserved for the client code, like + UNKNOWN_LOCATION or BUILTINS_LOCATION in GCC. */ source_location linemap_resolve_location (struct line_maps *set, @@ -1047,7 +1050,15 @@ linemap_resolve_location (struct line_maps *set, enum location_resolution_kind lrk, const struct line_map **map) { - linemap_assert (set && loc >= RESERVED_LOCATION_COUNT); + if (loc < RESERVED_LOCATION_COUNT) + { + /* A reserved location wasn't encoded in a map. Let's return a + NULL map here, just like what linemap_ordinary_map_lookup + does. */ + if (map) + *map = NULL; + return loc; + } switch (lrk) { @@ -1101,37 +1112,44 @@ linemap_unwind_toward_expansion (struct line_maps *set, } /* Expand source code location LOC and return a user readable source - code location. LOC must be a spelling (non-virtual) location. */ + code location. LOC must be a spelling (non-virtual) location. If + it's a location < RESERVED_LOCATION_COUNT a zeroed expanded source + location is returned. */ expanded_location -linemap_expand_location (const struct line_map *map, +linemap_expand_location (struct line_maps *set, + const struct line_map *map, source_location loc) { expanded_location xloc; - xloc.file = LINEMAP_FILE (map); - xloc.line = SOURCE_LINE (map, loc); - xloc.column = SOURCE_COLUMN (map, loc); - xloc.sysp = LINEMAP_SYSP (map) != 0; - - return xloc; -} - -/* Expand source code location LOC and return a user readable source - code location. LOC can be a virtual location. The LRK parameter - is the same as for linemap_resolve_location. */ + memset (&xloc, 0, sizeof (xloc)); + + if (loc < RESERVED_LOCATION_COUNT) + /* The location for this token wasn't generated from a line map. + It was probably a location for a builtin token, chosen by some + client code. Let's not try to expand the location in that + case. */; + else if (map == NULL) + /* We shouldn't be getting a NULL map with a location that is not + reserved by the client code. */ + abort (); + else + { + /* MAP must be an ordinary map and LOC must be non-virtual, + encoded into this map, obviously; the accessors used on MAP + below ensure it is ordinary. Let's just assert the + non-virtualness of LOC here. */ + if (linemap_location_from_macro_expansion_p (set, loc)) + abort (); -expanded_location -linemap_expand_location_full (struct line_maps *set, - source_location loc, - enum location_resolution_kind lrk) -{ - const struct line_map *map; - expanded_location xloc; + xloc.file = LINEMAP_FILE (map); + xloc.line = SOURCE_LINE (map, loc); + xloc.column = SOURCE_COLUMN (map, loc); + xloc.sysp = LINEMAP_SYSP (map) != 0; + } - loc = linemap_resolve_location (set, loc, lrk, &map); - xloc = linemap_expand_location (map, loc); return xloc; } @@ -1145,32 +1163,37 @@ linemap_dump_location (struct line_maps *set, { const struct line_map *map; source_location location; - const char *path, *from; - int l,c,s,e; + const char *path = "", *from = ""; + int l = -1, c = -1, s = -1, e = -1; if (loc == 0) return; location = linemap_resolve_location (set, loc, LRK_MACRO_DEFINITION_LOCATION, &map); - path = LINEMAP_FILE (map); - - l = SOURCE_LINE (map, location); - c = SOURCE_COLUMN (map, location); - s = LINEMAP_SYSP (map) != 0; - e = location != loc; - if (e) - from = "N/A"; + if (map == NULL) + /* Only reserved locations can be tolerated in this case. */ + linemap_assert (location < RESERVED_LOCATION_COUNT); else - from = (INCLUDED_FROM (set, map)) - ? LINEMAP_FILE (INCLUDED_FROM (set, map)) - : "<NULL>"; + { + path = LINEMAP_FILE (map); + l = SOURCE_LINE (map, location); + c = SOURCE_COLUMN (map, location); + s = LINEMAP_SYSP (map) != 0; + e = location != loc; + if (e) + from = "N/A"; + else + from = (INCLUDED_FROM (set, map)) + ? LINEMAP_FILE (INCLUDED_FROM (set, map)) + : "<NULL>"; + } /* P: path, L: line, C: column, S: in-system-header, M: map address, - E: macro expansion?. */ - fprintf (stream, "{P:%s;F:%s;L:%d;C:%d;S:%d;M:%p;E:%d,LOC:%d}", - path, from, l, c, s, (void*)map, e, loc); + E: macro expansion?, LOC: original location, R: resolved location */ + fprintf (stream, "{P:%s;F:%s;L:%d;C:%d;S:%d;M:%p;E:%d,LOC:%d,R:%d}", + path, from, l, c, s, (void*)map, e, loc, location); } /* Compute and return statistics about the memory consumption of some |