diff options
Diffstat (limited to 'libcpp/line-map.c')
-rw-r--r-- | libcpp/line-map.c | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/libcpp/line-map.c b/libcpp/line-map.c index a003af8..1a6902a 100644 --- a/libcpp/line-map.c +++ b/libcpp/line-map.c @@ -981,16 +981,15 @@ linemap_position_for_loc_and_offset (line_maps *set, (loc + offset) should be less than the first location encoded by the next line map of the set. Otherwise, we try to encode the location in the next map. */ - while (map != LINEMAPS_LAST_ORDINARY_MAP (set) + for (; map != LINEMAPS_LAST_ORDINARY_MAP (set) && (loc + (column_offset << map->m_range_bits) - >= MAP_START_LOCATION (&map[1]))) - { - map = &map[1]; - /* If the next map starts in a higher line, we cannot encode the - location there. */ - if (line < ORDINARY_MAP_STARTING_LINE_NUMBER (map)) - return loc; - } + >= MAP_START_LOCATION (map + 1)); map++) + /* If the next map is a different file, or starts in a higher line, we + cannot encode the location there. */ + if ((map + 1)->reason != LC_RENAME + || line < ORDINARY_MAP_STARTING_LINE_NUMBER (map + 1) + || 0 != strcmp (LINEMAP_FILE (map + 1), LINEMAP_FILE (map))) + return loc; column += column_offset; @@ -1321,7 +1320,7 @@ linemap_location_from_macro_expansion_p (const class line_maps *set, if (IS_ADHOC_LOC (location)) location = get_location_from_adhoc_loc (set, location); - return IS_MACRO_LOC (location); + return location >= LINEMAPS_MACRO_LOWEST_LOCATION (set); } /* Given two virtual locations *LOC0 and *LOC1, return the first @@ -1422,23 +1421,25 @@ linemap_compare_locations (line_maps *set, if (l0 == l1 && pre_virtual_p - && post_virtual_p - && l0 <= LINE_MAP_MAX_LOCATION_WITH_COLS) + && post_virtual_p) { /* So pre and post represent two tokens that are present in a same macro expansion. Let's see if the token for pre was before the token for post in that expansion. */ - unsigned i0, i1; const struct line_map *map = first_map_in_common (set, pre, post, &l0, &l1); if (map == NULL) - /* This should not be possible. */ - abort (); - - i0 = l0 - MAP_START_LOCATION (map); - i1 = l1 - MAP_START_LOCATION (map); - return i1 - i0; + /* This should not be possible while we have column information, but if + we don't, the tokens could be from separate macro expansions on the + same line. */ + gcc_assert (l0 > LINE_MAP_MAX_LOCATION_WITH_COLS); + else + { + unsigned i0 = l0 - MAP_START_LOCATION (map); + unsigned i1 = l1 - MAP_START_LOCATION (map); + return i1 - i0; + } } if (IS_ADHOC_LOC (l0)) |