diff options
Diffstat (limited to 'libcpp/line-map.cc')
-rw-r--r-- | libcpp/line-map.cc | 135 |
1 files changed, 92 insertions, 43 deletions
diff --git a/libcpp/line-map.cc b/libcpp/line-map.cc index e0f82e20..8b9f3e3 100644 --- a/libcpp/line-map.cc +++ b/libcpp/line-map.cc @@ -36,11 +36,11 @@ static location_t linemap_macro_map_loc_to_def_point static location_t linemap_macro_map_loc_to_exp_point (const line_map_macro *, location_t); static location_t linemap_macro_loc_to_spelling_point -(line_maps *, location_t, const line_map_ordinary **); -static location_t linemap_macro_loc_to_def_point (line_maps *, +(const line_maps *, location_t, const line_map_ordinary **); +static location_t linemap_macro_loc_to_def_point (const line_maps *, location_t, const line_map_ordinary **); -static location_t linemap_macro_loc_to_exp_point (line_maps *, +static location_t linemap_macro_loc_to_exp_point (const line_maps *, location_t, const line_map_ordinary **); @@ -126,7 +126,7 @@ rebuild_location_adhoc_htab (line_maps *set) within a location_t, without needing to use an ad-hoc location. */ static bool -can_be_stored_compactly_p (line_maps *set, +can_be_stored_compactly_p (const line_maps *set, location_t locus, source_range src_range, void *data, @@ -260,17 +260,48 @@ get_combined_adhoc_loc (line_maps *set, return ((*slot) - set->location_adhoc_data_map.data) | 0x80000000; } +/* Construct a location with caret at CARET, ranging from START to + FINISH. + + For example, consider: + + 11111111112 + 12345678901234567890 + 522 + 523 return foo + bar; + ~~~~^~~~~ + 524 + + The location's caret is at the "+", line 523 column 15, but starts + earlier, at the "f" of "foo" at column 11. The finish is at the "r" + of "bar" at column 19. */ + +location_t +line_maps::make_location (location_t caret, location_t start, location_t finish) +{ + location_t pure_loc = get_pure_location (caret); + source_range src_range; + src_range.m_start = get_start (start); + src_range.m_finish = get_finish (finish); + location_t combined_loc = COMBINE_LOCATION_DATA (this, + pure_loc, + src_range, + NULL, + 0); + return combined_loc; +} + /* Return the data for the adhoc loc. */ void * -get_data_from_adhoc_loc (const class line_maps *set, location_t loc) +get_data_from_adhoc_loc (const line_maps *set, location_t loc) { linemap_assert (IS_ADHOC_LOC (loc)); return set->location_adhoc_data_map.data[loc & MAX_LOCATION_T].data; } unsigned -get_discriminator_from_adhoc_loc (const class line_maps *set, location_t loc) +get_discriminator_from_adhoc_loc (const line_maps *set, location_t loc) { linemap_assert (IS_ADHOC_LOC (loc)); return set->location_adhoc_data_map.data[loc & MAX_LOCATION_T].discriminator; @@ -279,7 +310,7 @@ get_discriminator_from_adhoc_loc (const class line_maps *set, location_t loc) /* Return the location for the adhoc loc. */ location_t -get_location_from_adhoc_loc (const class line_maps *set, location_t loc) +get_location_from_adhoc_loc (const line_maps *set, location_t loc) { linemap_assert (IS_ADHOC_LOC (loc)); return set->location_adhoc_data_map.data[loc & MAX_LOCATION_T].locus; @@ -288,7 +319,7 @@ get_location_from_adhoc_loc (const class line_maps *set, location_t loc) /* Return the source_range for adhoc location LOC. */ static source_range -get_range_from_adhoc_loc (const class line_maps *set, location_t loc) +get_range_from_adhoc_loc (const line_maps *set, location_t loc) { linemap_assert (IS_ADHOC_LOC (loc)); return set->location_adhoc_data_map.data[loc & MAX_LOCATION_T].src_range; @@ -298,18 +329,17 @@ get_range_from_adhoc_loc (const class line_maps *set, location_t loc) lookaside table, or embedded inside LOC itself. */ source_range -get_range_from_loc (line_maps *set, - location_t loc) +line_maps::get_range_from_loc (location_t loc) const { if (IS_ADHOC_LOC (loc)) - return get_range_from_adhoc_loc (set, loc); + return get_range_from_adhoc_loc (this, loc); /* For ordinary maps, extract packed range. */ if (loc >= RESERVED_LOCATION_COUNT - && loc < LINEMAPS_MACRO_LOWEST_LOCATION (set) + && loc < LINEMAPS_MACRO_LOWEST_LOCATION (this) && loc <= LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES) { - const line_map *map = linemap_lookup (set, loc); + const line_map *map = linemap_lookup (this, loc); const line_map_ordinary *ordmap = linemap_check_ordinary (map); source_range result; int offset = loc & ((1 << ordmap->m_range_bits) - 1); @@ -321,8 +351,15 @@ get_range_from_loc (line_maps *set, return source_range::from_location (loc); } +source_range +get_range_from_loc (const line_maps *set, + location_t loc) +{ + return set->get_range_from_loc (loc); +} + unsigned -get_discriminator_from_loc (line_maps *set, +get_discriminator_from_loc (const line_maps *set, location_t loc) { if (IS_ADHOC_LOC (loc)) @@ -334,12 +371,12 @@ get_discriminator_from_loc (line_maps *set, whether it is an ad-hoc location, or embeds range information. */ bool -pure_location_p (line_maps *set, location_t loc) +line_maps::pure_location_p (location_t loc) const { if (IS_ADHOC_LOC (loc)) return false; - const line_map *map = linemap_lookup (set, loc); + const line_map *map = linemap_lookup (this, loc); if (map == NULL) return true; const line_map_ordinary *ordmap = linemap_check_ordinary (map); @@ -350,27 +387,39 @@ pure_location_p (line_maps *set, location_t loc) return true; } +bool +pure_location_p (const line_maps *set, location_t loc) +{ + return set->pure_location_p (loc); +} + /* Given location LOC within SET, strip away any packed range information or ad-hoc information. */ location_t -get_pure_location (line_maps *set, location_t loc) +line_maps::get_pure_location (location_t loc) const { if (IS_ADHOC_LOC (loc)) - loc = get_location_from_adhoc_loc (set, loc); + loc = get_location_from_adhoc_loc (this, loc); - if (loc >= LINEMAPS_MACRO_LOWEST_LOCATION (set)) + if (loc >= LINEMAPS_MACRO_LOWEST_LOCATION (this)) return loc; if (loc < RESERVED_LOCATION_COUNT) return loc; - const line_map *map = linemap_lookup (set, loc); + const line_map *map = linemap_lookup (this, loc); const line_map_ordinary *ordmap = linemap_check_ordinary (map); return loc & ~((1 << ordmap->m_range_bits) - 1); } +location_t +get_pure_location (const line_maps *set, location_t loc) +{ + return set->get_pure_location (loc); +} + /* Initialize a line map set. */ void @@ -396,7 +445,7 @@ linemap_init (line_maps *set, NULL if MAP was not an include. */ const line_map_ordinary * -linemap_included_from_linemap (line_maps *set, const line_map_ordinary *map) +linemap_included_from_linemap (const line_maps *set, const line_map_ordinary *map) { return linemap_ordinary_map_lookup (set, linemap_included_from (map)); } @@ -404,7 +453,7 @@ linemap_included_from_linemap (line_maps *set, const line_map_ordinary *map) /* Check for and warn about line_maps entered but not exited. */ void -linemap_check_files_exited (line_maps *set) +linemap_check_files_exited (const line_maps *set) { /* Depending upon whether we are handling preprocessed input or not, this can be a user error or an ICE. */ @@ -690,7 +739,7 @@ linemap_module_restore (line_maps *set, unsigned lwm) macro expansion, FALSE otherwise. */ bool -linemap_tracks_macro_expansion_locs_p (line_maps *set) +linemap_tracks_macro_expansion_locs_p (const line_maps *set) { return LINEMAPS_MACRO_MAPS (set) != NULL; } @@ -1214,7 +1263,7 @@ linemap_macro_map_loc_to_def_point (const line_map_macro *map, In other words, this returns the xI location presented in the comments of line_map_macro above. */ location_t -linemap_macro_map_loc_unwind_toward_spelling (line_maps *set, +linemap_macro_map_loc_unwind_toward_spelling (const line_maps *set, const line_map_macro* map, location_t location) { @@ -1243,7 +1292,7 @@ linemap_macro_map_loc_unwind_toward_spelling (line_maps *set, macro expansion point. */ int -linemap_get_expansion_line (line_maps *set, +linemap_get_expansion_line (const line_maps *set, location_t location) { const line_map_ordinary *map = NULL; @@ -1270,7 +1319,7 @@ linemap_get_expansion_line (line_maps *set, SET is the line map set LOCATION comes from. */ const char* -linemap_get_expansion_filename (line_maps *set, +linemap_get_expansion_filename (const line_maps *set, location_t location) { const struct line_map_ordinary *map = NULL; @@ -1306,7 +1355,7 @@ linemap_map_get_macro_name (const line_map_macro *macro_map) header, but expanded in a non-system file. */ int -linemap_location_in_system_header_p (line_maps *set, +linemap_location_in_system_header_p (const line_maps *set, location_t location) { const struct line_map *map = NULL; @@ -1366,7 +1415,7 @@ linemap_location_from_macro_expansion_p (const class line_maps *set, virtual location of the token inside the resulting macro. */ static const struct line_map* -first_map_in_common_1 (line_maps *set, +first_map_in_common_1 (const line_maps *set, location_t *loc0, location_t *loc1) { @@ -1413,7 +1462,7 @@ first_map_in_common_1 (line_maps *set, return of a non-NULL result. */ const struct line_map* -first_map_in_common (line_maps *set, +first_map_in_common (const line_maps *set, location_t loc0, location_t loc1, location_t *res_loc0, @@ -1431,7 +1480,7 @@ first_map_in_common (line_maps *set, otherwise. */ int -linemap_compare_locations (line_maps *set, +linemap_compare_locations (const line_maps *set, location_t pre, location_t post) { @@ -1506,7 +1555,7 @@ trace_include (const class line_maps *set, const line_map_ordinary *map) This is a subroutine for linemap_resolve_location. */ static location_t -linemap_macro_loc_to_spelling_point (line_maps *set, +linemap_macro_loc_to_spelling_point (const line_maps *set, location_t location, const line_map_ordinary **original_map) { @@ -1540,7 +1589,7 @@ linemap_macro_loc_to_spelling_point (line_maps *set, This is a subroutine of linemap_resolve_location. */ static location_t -linemap_macro_loc_to_def_point (line_maps *set, +linemap_macro_loc_to_def_point (const line_maps *set, location_t location, const line_map_ordinary **original_map) { @@ -1582,7 +1631,7 @@ linemap_macro_loc_to_def_point (line_maps *set, This is a subroutine of linemap_resolve_location. */ static location_t -linemap_macro_loc_to_exp_point (line_maps *set, +linemap_macro_loc_to_exp_point (const line_maps *set, location_t location, const line_map_ordinary **original_map) { @@ -1656,7 +1705,7 @@ linemap_macro_loc_to_exp_point (line_maps *set, UNKNOWN_LOCATION or BUILTINS_LOCATION in GCC. */ location_t -linemap_resolve_location (line_maps *set, +linemap_resolve_location (const line_maps *set, location_t loc, enum location_resolution_kind lrk, const line_map_ordinary **map) @@ -1696,7 +1745,7 @@ linemap_resolve_location (line_maps *set, definition of a macro, FALSE otherwise. */ bool -linemap_location_from_macro_definition_p (line_maps *set, +linemap_location_from_macro_definition_p (const line_maps *set, location_t loc) { if (IS_ADHOC_LOC (loc)) @@ -1736,7 +1785,7 @@ linemap_location_from_macro_definition_p (line_maps *set, to the map of the returned location. */ location_t -linemap_unwind_toward_expansion (line_maps *set, +linemap_unwind_toward_expansion (const line_maps *set, location_t loc, const struct line_map **map) { @@ -1776,7 +1825,7 @@ linemap_unwind_toward_expansion (line_maps *set, *MAP is set to the map of the returned location if the later is different from LOC. */ location_t -linemap_unwind_to_first_non_reserved_loc (line_maps *set, +linemap_unwind_to_first_non_reserved_loc (const line_maps *set, location_t loc, const struct line_map **map) { @@ -1820,7 +1869,7 @@ linemap_unwind_to_first_non_reserved_loc (line_maps *set, location is returned. */ expanded_location -linemap_expand_location (line_maps *set, +linemap_expand_location (const line_maps *set, const struct line_map *map, location_t loc) @@ -1869,7 +1918,7 @@ linemap_expand_location (line_maps *set, dump a macro map, false otherwise. */ void -linemap_dump (FILE *stream, class line_maps *set, unsigned ix, bool is_macro) +linemap_dump (FILE *stream, const line_maps *set, unsigned ix, bool is_macro) { const char *const lc_reasons_v[LC_HWM] = { "LC_ENTER", "LC_LEAVE", "LC_RENAME", "LC_RENAME_VERBATIM", @@ -1925,7 +1974,7 @@ linemap_dump (FILE *stream, class line_maps *set, unsigned ix, bool is_macro) stream STREAM. SET is the line map set LOC comes from. */ void -linemap_dump_location (line_maps *set, +linemap_dump_location (const line_maps *set, location_t loc, FILE *stream) { @@ -1975,7 +2024,7 @@ linemap_dump_location (line_maps *set, location emitted for that file. */ bool -linemap_get_file_highest_location (line_maps *set, +linemap_get_file_highest_location (const line_maps *set, const char *file_name, location_t *loc) { @@ -2013,7 +2062,7 @@ linemap_get_file_highest_location (line_maps *set, parts of the line table SET. */ void -linemap_get_statistics (line_maps *set, +linemap_get_statistics (const line_maps *set, struct linemap_stats *s) { long ordinary_maps_allocated_size, ordinary_maps_used_size, @@ -2077,7 +2126,7 @@ linemap_get_statistics (line_maps *set, specifies how many macro maps to dump. */ void -line_table_dump (FILE *stream, class line_maps *set, unsigned int num_ordinary, +line_table_dump (FILE *stream, const line_maps *set, unsigned int num_ordinary, unsigned int num_macro) { unsigned int i; |