aboutsummaryrefslogtreecommitdiff
path: root/libcpp/line-map.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libcpp/line-map.cc')
-rw-r--r--libcpp/line-map.cc135
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;