aboutsummaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authorLewis Hyatt <lhyatt@gmail.com>2024-10-28 13:19:40 -0400
committerLewis Hyatt <lhyatt@gcc.gnu.org>2024-11-23 13:44:37 -0500
commit927625d007f47377a091d541de42c7840a4a5af6 (patch)
tree5725b7970c1f43c50e8fb0c207ac64b8e1f5ad31 /libcpp
parentfd118f4c54c374882bf91c9e61b756767c0d3634 (diff)
downloadgcc-927625d007f47377a091d541de42c7840a4a5af6.zip
gcc-927625d007f47377a091d541de42c7840a4a5af6.tar.gz
gcc-927625d007f47377a091d541de42c7840a4a5af6.tar.bz2
Support for 64-bit location_t: libcpp preliminaries
Prepare libcpp to support 64-bit location_t, without yet making any functional changes, by adding new typedefs that enable code to be written such that it works with any size location_t. Update the usage of line maps within libcpp accordingly. Subsequent patches will prepare the rest of the codebase similarly, and then afterwards, location_t will be changed to uint64_t. libcpp/ChangeLog: * include/line-map.h (line_map_uint_t): New typedef, the same type as location_t. (location_diff_t): New typedef. (line_map_suggested_range_bits): New constant. (struct maps_info_ordinary): Change member types from "unsigned int" to "line_map_uint_t". (struct maps_info_macro): Likewise. (struct location_adhoc_data_map): Likewise. (LINEMAPS_ALLOCATED): Change return type from "unsigned int" to "line_map_uint_t". (LINEMAPS_ORDINARY_ALLOCATED): Likewise. (LINEMAPS_MACRO_ALLOCATED): Likewise. (LINEMAPS_USED): Likewise. (LINEMAPS_ORDINARY_USED): Likewise. (LINEMAPS_MACRO_USED): Likewise. (linemap_lookup_macro_index): Likewise. (LINEMAPS_MAP_AT): Change argument type from "unsigned int" to "line_map_uint_t". (LINEMAPS_ORDINARY_MAP_AT): Likewise. (LINEMAPS_MACRO_MAP_AT): Likewise. (line_map_new_raw): Likewise. (linemap_module_restore): Likewise. (linemap_dump): Likewise. (line_table_dump): Likewise. (LINEMAPS_LAST_MAP): Add a linemap_assert() for safety. (SOURCE_COLUMN): Use a cast to ensure correctness if location_t becomes a 64-bit type. * line-map.cc (location_adhoc_data_hash): Don't truncate to 32-bit prematurely when hashing. (line_maps::get_or_create_combined_loc): Adapt types to support potentially 64-bit location_t. Use MAX_LOCATION_T rather than a hard-coded constant. (line_maps::get_range_from_loc): Adapt types and constants to support potentially 64-bit location_t. (line_maps::pure_location_p): Likewise. (line_maps::get_pure_location): Likewise. (line_map_new_raw): Likewise. (LAST_SOURCE_LINE_LOCATION): Likewise. (linemap_add): Likewise. (linemap_module_restore): Likewise. (linemap_line_start): Likewise. (linemap_position_for_column): Likewise. (linemap_position_for_line_and_column): Likewise. (linemap_position_for_loc_and_offset): Likewise. (linemap_ordinary_map_lookup): Likewise. (linemap_lookup_macro_index): Likewise. (linemap_dump): Likewise. (linemap_dump_location): Likewise. (linemap_get_file_highest_location): Likewise. (line_table_dump): Likewise. (linemap_compare_locations): Avoid signed int overflow in the result. * macro.cc (num_expanded_macros_counter): Change type of global variable from "unsigned int" to "line_map_uint_t". (num_macro_tokens_counter): Likewise.
Diffstat (limited to 'libcpp')
-rw-r--r--libcpp/include/line-map.h86
-rw-r--r--libcpp/line-map.cc137
-rw-r--r--libcpp/macro.cc4
3 files changed, 129 insertions, 98 deletions
diff --git a/libcpp/include/line-map.h b/libcpp/include/line-map.h
index 732ec5e..96fdf60 100644
--- a/libcpp/include/line-map.h
+++ b/libcpp/include/line-map.h
@@ -87,9 +87,9 @@ enum lc_reason
gcc there is a single line_maps instance: "line_table", declared in
gcc/input.h and defined in gcc/input.cc.
- The values of the keys are intended to be internal to libcpp,
- but for ease-of-understanding the implementation, they are currently
- assigned as follows:
+ The values of the keys are intended to be internal to libcpp, but for
+ ease-of-understanding the implementation, they are currently assigned as
+ follows in the case of 32-bit location_t:
Actual | Value | Meaning
-----------+-------------------------------+-------------------------------
@@ -292,6 +292,12 @@ enum lc_reason
To further see how location_t works in practice, see the
worked example in libcpp/location-example.txt. */
typedef unsigned int location_t;
+typedef int64_t location_diff_t;
+
+/* Sometimes we need a type that has the same size as location_t but that does
+ not represent a location. This typedef provides more clarity in those
+ cases. */
+typedef location_t line_map_uint_t;
/* Do not track column numbers higher than this one. As a result, the
range of column_bits is [12, 18] (or 0 if column numbers are
@@ -311,6 +317,10 @@ const location_t LINE_MAP_MAX_LOCATION_WITH_COLS = 0x60000000;
/* Highest possible source location encoded within an ordinary map. */
const location_t LINE_MAP_MAX_LOCATION = 0x70000000;
+/* This is the number of range bits suggested to enable, if range tracking is
+ desired. */
+const int line_map_suggested_range_bits = 5;
+
/* A range of source locations.
Ranges are closed:
@@ -728,15 +738,15 @@ struct GTY(()) maps_info_ordinary {
line_map_ordinary * GTY ((length ("%h.used"))) maps;
/* The total number of allocated maps. */
- unsigned int allocated;
+ line_map_uint_t allocated;
/* The number of elements used in maps. This number is smaller
or equal to ALLOCATED. */
- unsigned int used;
+ line_map_uint_t used;
/* The index of the last ordinary map that was looked up with
linemap_lookup. */
- mutable unsigned int m_cache;
+ mutable line_map_uint_t m_cache;
};
struct GTY(()) maps_info_macro {
@@ -745,15 +755,15 @@ struct GTY(()) maps_info_macro {
line_map_macro * GTY ((length ("%h.used"))) maps;
/* The total number of allocated maps. */
- unsigned int allocated;
+ line_map_uint_t allocated;
/* The number of elements used in maps. This number is smaller
or equal to ALLOCATED. */
- unsigned int used;
+ line_map_uint_t used;
/* The index of the last macro map that was looked up with
linemap_lookup. */
- mutable unsigned int m_cache;
+ mutable line_map_uint_t m_cache;
};
/* Data structure to associate a source_range together with an arbitrary
@@ -780,7 +790,7 @@ struct htab;
struct GTY(()) location_adhoc_data_map {
struct htab * GTY((skip)) htab;
location_t curr_loc;
- unsigned int allocated;
+ line_map_uint_t allocated;
struct location_adhoc_data GTY((length ("%h.allocated"))) *data;
};
@@ -861,13 +871,13 @@ public:
/* The default value of range_bits in ordinary line maps. */
unsigned int default_range_bits;
- unsigned int m_num_optimized_ranges;
- unsigned int m_num_unoptimized_ranges;
+ line_map_uint_t m_num_optimized_ranges;
+ line_map_uint_t m_num_unoptimized_ranges;
};
/* Returns the number of allocated maps so far. MAP_KIND shall be TRUE
if we are interested in macro maps, FALSE otherwise. */
-inline unsigned int
+inline line_map_uint_t
LINEMAPS_ALLOCATED (const line_maps *set, bool map_kind)
{
if (map_kind)
@@ -878,7 +888,7 @@ LINEMAPS_ALLOCATED (const line_maps *set, bool map_kind)
/* As above, but by reference (e.g. as an lvalue). */
-inline unsigned int &
+inline line_map_uint_t &
LINEMAPS_ALLOCATED (line_maps *set, bool map_kind)
{
if (map_kind)
@@ -889,7 +899,7 @@ LINEMAPS_ALLOCATED (line_maps *set, bool map_kind)
/* Returns the number of used maps so far. MAP_KIND shall be TRUE if
we are interested in macro maps, FALSE otherwise.*/
-inline unsigned int
+inline line_map_uint_t
LINEMAPS_USED (const line_maps *set, bool map_kind)
{
if (map_kind)
@@ -900,7 +910,7 @@ LINEMAPS_USED (const line_maps *set, bool map_kind)
/* As above, but by reference (e.g. as an lvalue). */
-inline unsigned int &
+inline line_map_uint_t &
LINEMAPS_USED (line_maps *set, bool map_kind)
{
if (map_kind)
@@ -911,7 +921,7 @@ LINEMAPS_USED (line_maps *set, bool map_kind)
/* Return the map at a given index. */
inline line_map *
-LINEMAPS_MAP_AT (const line_maps *set, bool map_kind, int index)
+LINEMAPS_MAP_AT (const line_maps *set, bool map_kind, line_map_uint_t index)
{
if (map_kind)
return &set->info_macro.maps[index];
@@ -925,29 +935,29 @@ LINEMAPS_MAP_AT (const line_maps *set, bool map_kind, int index)
inline line_map *
LINEMAPS_LAST_MAP (const line_maps *set, bool map_kind)
{
+ linemap_assert (LINEMAPS_USED (set, map_kind));
return LINEMAPS_MAP_AT (set, map_kind,
LINEMAPS_USED (set, map_kind) - 1);
}
/* Returns the INDEXth ordinary map. */
inline line_map_ordinary *
-LINEMAPS_ORDINARY_MAP_AT (const line_maps *set, int index)
+LINEMAPS_ORDINARY_MAP_AT (const line_maps *set, line_map_uint_t index)
{
- linemap_assert (index >= 0
- && (unsigned int)index < LINEMAPS_USED (set, false));
+ linemap_assert (index < LINEMAPS_USED (set, false));
return (line_map_ordinary *)LINEMAPS_MAP_AT (set, false, index);
}
/* Return the number of ordinary maps allocated in the line table
SET. */
-inline unsigned int
+inline line_map_uint_t
LINEMAPS_ORDINARY_ALLOCATED (const line_maps *set)
{
return LINEMAPS_ALLOCATED (set, false);
}
/* Return the number of ordinary maps used in the line table SET. */
-inline unsigned int
+inline line_map_uint_t
LINEMAPS_ORDINARY_USED (const line_maps *set)
{
return LINEMAPS_USED (set, false);
@@ -963,23 +973,22 @@ LINEMAPS_LAST_ORDINARY_MAP (const line_maps *set)
/* Returns the INDEXth macro map. */
inline line_map_macro *
-LINEMAPS_MACRO_MAP_AT (const line_maps *set, int index)
+LINEMAPS_MACRO_MAP_AT (const line_maps *set, line_map_uint_t index)
{
- linemap_assert (index >= 0
- && (unsigned int)index < LINEMAPS_USED (set, true));
+ linemap_assert (index < LINEMAPS_USED (set, true));
return (line_map_macro *)LINEMAPS_MAP_AT (set, true, index);
}
/* Returns the number of macro maps that were allocated in the line
table SET. */
-inline unsigned int
+inline line_map_uint_t
LINEMAPS_MACRO_ALLOCATED (const line_maps *set)
{
return LINEMAPS_ALLOCATED (set, true);
}
/* Returns the number of macro maps used in the line table SET. */
-inline unsigned int
+inline line_map_uint_t
LINEMAPS_MACRO_USED (const line_maps *set)
{
return LINEMAPS_USED (set, true);
@@ -1044,7 +1053,7 @@ extern location_t linemap_line_start
(class line_maps *set, linenum_type to_line, unsigned int max_column_hint);
/* Allocate a raw block of line maps, zero initialized. */
-extern line_map *line_map_new_raw (line_maps *, bool, unsigned);
+extern line_map *line_map_new_raw (line_maps *, bool, line_map_uint_t);
/* Add a mapping of logical source line to physical source file and
line number. This function creates an "ordinary map", which is a
@@ -1094,8 +1103,8 @@ extern void linemap_module_reparent
/* Restore the linemap state such that the map at LWM-1 continues.
Return start location of the new map. */
-extern unsigned linemap_module_restore
- (line_maps *, unsigned lwm);
+extern location_t linemap_module_restore
+ (line_maps *, line_map_uint_t lwm);
/* Given a logical source location, returns the map which the
corresponding (source file, line, column) triplet can be deduced
@@ -1106,7 +1115,7 @@ extern unsigned linemap_module_restore
extern const line_map *linemap_lookup
(const line_maps *, location_t);
-unsigned linemap_lookup_macro_index (const line_maps *, location_t);
+line_map_uint_t linemap_lookup_macro_index (const line_maps *, location_t);
/* Returns TRUE if the line table set tracks token locations across
macro expansion, FALSE otherwise. */
@@ -1165,7 +1174,8 @@ inline linenum_type
SOURCE_COLUMN (const line_map_ordinary *ord_map, location_t loc)
{
return ((loc - ord_map->start_location)
- & ((1 << ord_map->m_column_and_range_bits) - 1)) >> ord_map->m_range_bits;
+ & ((location_t (1) << ord_map->m_column_and_range_bits) - 1))
+ >> ord_map->m_range_bits;
}
@@ -1244,9 +1254,10 @@ const struct line_map *first_map_in_common (const line_maps *set,
comes before the token of POST, 0 if PRE denotes the location of
the same token as the token for POST, and a negative value
otherwise. */
-int linemap_compare_locations (const line_maps *set,
- location_t pre,
- location_t post);
+int
+linemap_compare_locations (const line_maps *set,
+ location_t pre,
+ location_t post);
/* Return TRUE if LOC_A denotes the location a token that comes
topogically before the token denoted by location LOC_B, or if they
@@ -1413,12 +1424,13 @@ void linemap_dump_location (const line_maps *, location_t, FILE *);
/* Dump line map at index IX in line table SET to STREAM. If STREAM
is NULL, use stderr. IS_MACRO is true if the caller wants to
dump a macro map, false otherwise. */
-void linemap_dump (FILE *, const line_maps *, unsigned, bool);
+void linemap_dump (FILE *, const line_maps *, line_map_uint_t, bool);
/* Dump line table SET to STREAM. If STREAM is NULL, stderr is used.
NUM_ORDINARY specifies how many ordinary maps to dump. NUM_MACRO
specifies how many macro maps to dump. */
-void line_table_dump (FILE *, const line_maps *, unsigned int, unsigned int);
+void line_table_dump (FILE *, const line_maps *,
+ line_map_uint_t, line_map_uint_t);
/* An enum for distinguishing the various parts within a location_t. */
diff --git a/libcpp/line-map.cc b/libcpp/line-map.cc
index ac765c7..c9039d0 100644
--- a/libcpp/line-map.cc
+++ b/libcpp/line-map.cc
@@ -26,6 +26,9 @@ along with this program; see the file COPYING3. If not see
#include "internal.h"
#include "hashtab.h"
+/* Useful for the bit manipulations in this file. */
+static constexpr location_t loc_one = 1;
+
static void trace_include (const line_maps *, const line_map_ordinary *);
static const line_map_ordinary * linemap_ordinary_map_lookup (const line_maps *,
location_t);
@@ -45,8 +48,8 @@ static location_t linemap_macro_loc_to_exp_point (const line_maps *,
const line_map_ordinary **);
/* Counters defined in macro.cc. */
-extern unsigned num_expanded_macros_counter;
-extern unsigned num_macro_tokens_counter;
+extern line_map_uint_t num_expanded_macros_counter;
+extern line_map_uint_t num_macro_tokens_counter;
/* Destructor for class line_maps.
Ensure non-GC-managed memory is released. */
@@ -64,11 +67,11 @@ location_adhoc_data_hash (const void *l)
{
const struct location_adhoc_data *lb =
(const struct location_adhoc_data *) l;
- return ((hashval_t) lb->locus
- + (hashval_t) lb->src_range.m_start
- + (hashval_t) lb->src_range.m_finish
- + (size_t) lb->data
- + lb->discriminator);
+ return lb->locus
+ + lb->src_range.m_start
+ + lb->src_range.m_finish
+ + (size_t) lb->data
+ + lb->discriminator;
}
/* Compare function for location_adhoc_data hashtable. */
@@ -197,9 +200,9 @@ line_maps::get_or_create_combined_loc (location_t locus,
linemap_assert (pure_location_p (locus));
const line_map *map = linemap_lookup (this, locus);
const line_map_ordinary *ordmap = linemap_check_ordinary (map);
- unsigned int int_diff = src_range.m_finish - src_range.m_start;
- unsigned int col_diff = (int_diff >> ordmap->m_range_bits);
- if (col_diff < (1U << ordmap->m_range_bits))
+ auto int_diff = src_range.m_finish - src_range.m_start;
+ auto col_diff = (int_diff >> ordmap->m_range_bits);
+ if (col_diff < (loc_one << ordmap->m_range_bits))
{
location_t packed = locus | col_diff;
m_num_optimized_ranges++;
@@ -255,7 +258,7 @@ line_maps::get_or_create_combined_loc (location_t locus,
m_location_adhoc_data_map.data[m_location_adhoc_data_map.curr_loc++]
= lb;
}
- return ((*slot) - m_location_adhoc_data_map.data) | 0x80000000;
+ return ((*slot) - m_location_adhoc_data_map.data) | (1 + MAX_LOCATION_T);
}
/* Construct a location with caret at CARET, ranging from START to
@@ -339,7 +342,7 @@ line_maps::get_range_from_loc (location_t loc) const
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);
+ auto offset = loc & ((loc_one << ordmap->m_range_bits) - 1);
result.m_start = loc - offset;
result.m_finish = result.m_start + (offset << ordmap->m_range_bits);
return result;
@@ -378,7 +381,7 @@ line_maps::pure_location_p (location_t loc) const
return true;
const line_map_ordinary *ordmap = linemap_check_ordinary (map);
- if (loc & ((1U << ordmap->m_range_bits) - 1))
+ if (loc & ((loc_one << ordmap->m_range_bits) - 1))
return false;
return true;
@@ -408,7 +411,7 @@ line_maps::get_pure_location (location_t loc) const
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);
+ return loc & ~((loc_one << ordmap->m_range_bits) - 1);
}
location_t
@@ -464,10 +467,10 @@ linemap_check_files_exited (const line_maps *set)
/* Create NUM zero-initialized maps of type MACRO_P. */
line_map *
-line_map_new_raw (line_maps *set, bool macro_p, unsigned num)
+line_map_new_raw (line_maps *set, bool macro_p, line_map_uint_t num)
{
- unsigned num_maps_allocated = LINEMAPS_ALLOCATED (set, macro_p);
- unsigned num_maps_used = LINEMAPS_USED (set, macro_p);
+ auto num_maps_allocated = LINEMAPS_ALLOCATED (set, macro_p);
+ auto num_maps_used = LINEMAPS_USED (set, macro_p);
if (num > num_maps_allocated - num_maps_used)
{
@@ -504,7 +507,7 @@ line_map_new_raw (line_maps *set, bool macro_p, unsigned num)
/* Now alloc_size contains the exact memory size we would get if
we have asked for the initial alloc_size amount of memory.
Let's get back to the number of map that amounts to. */
- unsigned num_maps = alloc_size / size_of_a_map;
+ line_map_uint_t num_maps = alloc_size / size_of_a_map;
buffer = set->m_reallocator (buffer, num_maps * size_of_a_map);
memset ((char *)buffer + num_maps_used * size_of_a_map, 0,
(num_maps - num_maps_used) * size_of_a_map);
@@ -546,7 +549,7 @@ LAST_SOURCE_LINE_LOCATION (const line_map_ordinary *map)
{
return (((map[1].start_location - 1
- map->start_location)
- & ~((1 << map->m_column_and_range_bits) - 1))
+ & ~((loc_one << map->m_column_and_range_bits) - 1))
+ map->start_location);
}
@@ -573,8 +576,8 @@ linemap_add (line_maps *set, enum lc_reason reason,
unsigned range_bits = 0;
if (start_location < LINE_MAP_MAX_LOCATION_WITH_COLS)
range_bits = set->default_range_bits;
- start_location += (1 << range_bits) - 1;
- start_location &= ~((1 << range_bits) - 1);
+ start_location += (loc_one << range_bits) - 1;
+ start_location &= ~((loc_one << range_bits) - 1);
linemap_assert (!LINEMAPS_ORDINARY_USED (set)
|| (start_location
@@ -660,7 +663,7 @@ linemap_add (line_maps *set, enum lc_reason reason,
/* The location of the end of the just-closed map. */
map->included_from
= (((map[0].start_location - 1 - map[-1].start_location)
- & ~((1 << map[-1].m_column_and_range_bits) - 1))
+ & ~((loc_one << map[-1].m_column_and_range_bits) - 1))
+ map[-1].start_location);
set->depth++;
if (set->trace_includes)
@@ -707,8 +710,8 @@ linemap_module_reparent (line_maps *set, location_t loc, location_t adoptor)
Append a new map, continuing the interrupted one. Return the start location
of the new map, or 0 if failed (because we ran out of locations. */
-unsigned
-linemap_module_restore (line_maps *set, unsigned lwm)
+location_t
+linemap_module_restore (line_maps *set, line_map_uint_t lwm)
{
linemap_assert (lwm);
@@ -847,7 +850,7 @@ linemap_line_start (line_maps *set, linenum_type to_line,
location_t r;
linenum_type last_line =
SOURCE_LINE (map, set->highest_line);
- int line_delta = to_line - last_line;
+ auto line_delta = (linenum_arith_t) to_line - (linenum_arith_t) last_line;
bool add_map = false;
linemap_assert (map->m_column_and_range_bits >= map->m_range_bits);
int effective_column_bits = map->m_column_and_range_bits - map->m_range_bits;
@@ -897,7 +900,8 @@ linemap_line_start (line_maps *set, linenum_type to_line,
single line we can sometimes just increase its column_bits instead. */
if (line_delta < 0
|| last_line != ORDINARY_MAP_STARTING_LINE_NUMBER (map)
- || SOURCE_COLUMN (map, highest) >= (1U << (column_bits - range_bits))
+ || SOURCE_COLUMN (map, highest) >= (loc_one
+ << (column_bits - range_bits))
|| ( /* We can't reuse the map if the line offset is sufficiently
large to cause overflow when computing location_t values. */
(to_line - ORDINARY_MAP_STARTING_LINE_NUMBER (map))
@@ -913,11 +917,12 @@ linemap_line_start (line_maps *set, linenum_type to_line,
map->m_column_and_range_bits = column_bits;
map->m_range_bits = range_bits;
r = (MAP_START_LOCATION (map)
- + ((to_line - ORDINARY_MAP_STARTING_LINE_NUMBER (map))
+ + (location_t (to_line - ORDINARY_MAP_STARTING_LINE_NUMBER (map))
<< column_bits));
}
else
- r = set->highest_line + (line_delta << map->m_column_and_range_bits);
+ r = set->highest_line + (location_t (line_delta)
+ << map->m_column_and_range_bits);
/* Locations of ordinary tokens are always lower than locations of
macro tokens. */
@@ -992,7 +997,7 @@ linemap_position_for_column (line_maps *set, unsigned int to_column)
}
}
line_map_ordinary *map = LINEMAPS_LAST_ORDINARY_MAP (set);
- r = r + (to_column << map->m_range_bits);
+ r = r + (location_t (to_column) << map->m_range_bits);
if (r >= set->highest_location)
set->highest_location = r;
return r;
@@ -1010,10 +1015,10 @@ linemap_position_for_line_and_column (line_maps *set,
linemap_assert (ORDINARY_MAP_STARTING_LINE_NUMBER (ord_map) <= line);
location_t r = MAP_START_LOCATION (ord_map);
- r += ((line - ORDINARY_MAP_STARTING_LINE_NUMBER (ord_map))
+ r += (location_t (line - ORDINARY_MAP_STARTING_LINE_NUMBER (ord_map))
<< ord_map->m_column_and_range_bits);
if (r <= LINE_MAP_MAX_LOCATION_WITH_COLS)
- r += ((column & ((1 << ord_map->m_column_and_range_bits) - 1))
+ r += ((column & ((loc_one << ord_map->m_column_and_range_bits) - 1))
<< ord_map->m_range_bits);
location_t upper_limit = LINEMAPS_MACRO_LOWEST_LOCATION (set);
if (r >= upper_limit)
@@ -1050,10 +1055,12 @@ linemap_position_for_loc_and_offset (line_maps *set,
/* We find the real location and shift it. */
loc = linemap_resolve_location (set, loc, LRK_SPELLING_LOCATION, &map);
+ auto shifted_offset = location_t (column_offset) << map->m_range_bits;
+
/* The new location (loc + offset) should be higher than the first
location encoded by MAP. This can fail if the line information
is messed up because of line directives (see PR66415). */
- if (MAP_START_LOCATION (map) >= loc + (column_offset << map->m_range_bits))
+ if (MAP_START_LOCATION (map) >= loc + shifted_offset)
return loc;
linenum_type line = SOURCE_LINE (map, loc);
@@ -1064,8 +1071,7 @@ linemap_position_for_loc_and_offset (line_maps *set,
the next line map of the set. Otherwise, we try to encode the
location in the next map. */
for (; map != LINEMAPS_LAST_ORDINARY_MAP (set)
- && (loc + (column_offset << map->m_range_bits)
- >= MAP_START_LOCATION (map + 1)); map++)
+ && loc + shifted_offset >= 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
@@ -1116,8 +1122,8 @@ linemap_ordinary_map_lookup (const line_maps *set, location_t line)
if (set == NULL || line < RESERVED_LOCATION_COUNT)
return NULL;
- unsigned mn = set->info_ordinary.m_cache;
- unsigned mx = LINEMAPS_ORDINARY_USED (set);
+ auto mn = set->info_ordinary.m_cache;
+ auto mx = LINEMAPS_ORDINARY_USED (set);
const line_map_ordinary *cached = LINEMAPS_ORDINARY_MAP_AT (set, mn);
/* We should get a segfault if no line_maps have been added yet. */
@@ -1134,7 +1140,7 @@ linemap_ordinary_map_lookup (const line_maps *set, location_t line)
while (mx - mn > 1)
{
- unsigned md = (mn + mx) / 2;
+ auto md = (mn + mx) / 2;
if (MAP_START_LOCATION (LINEMAPS_ORDINARY_MAP_AT (set, md)) > line)
mx = md;
else
@@ -1163,18 +1169,18 @@ linemap_macro_map_lookup (const line_maps *set, location_t line)
if (set == NULL)
return NULL;
- unsigned ix = linemap_lookup_macro_index (set, line);
+ auto ix = linemap_lookup_macro_index (set, line);
const struct line_map_macro *result = LINEMAPS_MACRO_MAP_AT (set, ix);
linemap_assert (MAP_START_LOCATION (result) <= line);
return result;
}
-unsigned
+line_map_uint_t
linemap_lookup_macro_index (const line_maps *set, location_t line)
{
- unsigned mn = set->info_macro.m_cache;
- unsigned mx = LINEMAPS_MACRO_USED (set);
+ auto mn = set->info_macro.m_cache;
+ auto mx = LINEMAPS_MACRO_USED (set);
const struct line_map_macro *cached = LINEMAPS_MACRO_MAP_AT (set, mn);
if (line >= MAP_START_LOCATION (cached))
@@ -1188,7 +1194,7 @@ linemap_lookup_macro_index (const line_maps *set, location_t line)
while (mn < mx)
{
- unsigned md = (mx + mn) / 2;
+ auto md = (mx + mn) / 2;
if (MAP_START_LOCATION (LINEMAPS_MACRO_MAP_AT (set, md)) > line)
mn = md + 1;
else
@@ -1529,7 +1535,10 @@ linemap_compare_locations (const line_maps *set,
if (IS_ADHOC_LOC (l1))
l1 = get_location_from_adhoc_loc (set, l1);
- return l1 - l0;
+ /* This function is intended e.g. for implementing a qsort() comparator, so it
+ needs to return really an "int" and not something larger. */
+ const auto res = (location_diff_t)l1 - (location_diff_t)l0;
+ return res < INT_MIN ? INT_MIN : res > INT_MAX ? INT_MAX : res;
}
/* Print an include trace, for e.g. the -H option of the preprocessor. */
@@ -1914,7 +1923,8 @@ linemap_expand_location (const line_maps *set,
dump a macro map, false otherwise. */
void
-linemap_dump (FILE *stream, const line_maps *set, unsigned ix, bool is_macro)
+linemap_dump (FILE *stream, const line_maps *set, line_map_uint_t ix,
+ bool is_macro)
{
const char *const lc_reasons_v[LC_HWM]
= { "LC_ENTER", "LC_LEAVE", "LC_RENAME", "LC_RENAME_VERBATIM",
@@ -1936,8 +1946,10 @@ linemap_dump (FILE *stream, const line_maps *set, unsigned ix, bool is_macro)
reason = LC_ENTER_MACRO;
}
- fprintf (stream, "Map #%u [%p] - LOC: %u - REASON: %s - SYSP: %s\n",
- ix, (void *) map, map->start_location,
+ fprintf (stream, "Map #%llu [%p] - LOC: %llu - REASON: %s - SYSP: %s\n",
+ (unsigned long long) ix,
+ (void *) map,
+ (unsigned long long) map->start_location,
reason < LC_HWM ? lc_reasons_v[reason] : "???",
((!is_macro
&& ORDINARY_MAP_IN_SYSTEM_HEADER_P (linemap_check_ordinary (map)))
@@ -1948,10 +1960,12 @@ linemap_dump (FILE *stream, const line_maps *set, unsigned ix, bool is_macro)
const line_map_ordinary *includer_map
= linemap_included_from_linemap (set, ord_map);
- fprintf (stream, "File: %s:%d\n", ORDINARY_MAP_FILE_NAME (ord_map),
+ fprintf (stream, "File: %s:%u\n", ORDINARY_MAP_FILE_NAME (ord_map),
ORDINARY_MAP_STARTING_LINE_NUMBER (ord_map));
- fprintf (stream, "Included from: [%d] %s\n",
- includer_map ? int (includer_map - set->info_ordinary.maps) : -1,
+ const long long from_ind
+ = includer_map ? includer_map - set->info_ordinary.maps : -1;
+ fprintf (stream, "Included from: [%lld] %s\n",
+ from_ind,
includer_map ? ORDINARY_MAP_FILE_NAME (includer_map) : "None");
}
else
@@ -2010,8 +2024,10 @@ linemap_dump_location (const line_maps *set,
/* P: path, L: line, C: column, S: in-system-header, M: map address,
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);
+ fprintf (stream, "{P:%s;F:%s;L:%d;C:%d;S:%d;M:%p;E:%d,LOC:%llu,R:%llu}",
+ path, from, l, c, s, (void*)map, e,
+ (unsigned long long) loc,
+ (unsigned long long) location);
}
/* Return the highest location emitted for a given file for which
@@ -2030,7 +2046,7 @@ linemap_get_file_highest_location (const line_maps *set,
return false;
/* Now look for the last ordinary map created for FILE_NAME. */
- int i;
+ location_diff_t i;
for (i = set->info_ordinary.used - 1; i >= 0; --i)
{
const char *fname = set->info_ordinary.maps[i].to_file;
@@ -2045,7 +2061,7 @@ linemap_get_file_highest_location (const line_maps *set,
location of the next map minus one, or -- if the map is the
latest one -- the highest location of the set. */
location_t result;
- if (i == (int) set->info_ordinary.used - 1)
+ if ((location_t) i == set->info_ordinary.used - 1)
result = set->highest_location;
else
result = set->info_ordinary.maps[i + 1].start_location - 1;
@@ -2122,10 +2138,10 @@ linemap_get_statistics (const line_maps *set,
specifies how many macro maps to dump. */
void
-line_table_dump (FILE *stream, const line_maps *set, unsigned int num_ordinary,
- unsigned int num_macro)
+line_table_dump (FILE *stream, const line_maps *set,
+ line_map_uint_t num_ordinary, line_map_uint_t num_macro)
{
- unsigned int i;
+ line_map_uint_t i;
if (set == NULL)
return;
@@ -2133,10 +2149,13 @@ line_table_dump (FILE *stream, const line_maps *set, unsigned int num_ordinary,
if (stream == NULL)
stream = stderr;
- fprintf (stream, "# of ordinary maps: %d\n", LINEMAPS_ORDINARY_USED (set));
- fprintf (stream, "# of macro maps: %d\n", LINEMAPS_MACRO_USED (set));
+ fprintf (stream, "# of ordinary maps: %llu\n",
+ (unsigned long long) LINEMAPS_ORDINARY_USED (set));
+ fprintf (stream, "# of macro maps: %llu\n",
+ (unsigned long long) LINEMAPS_MACRO_USED (set));
fprintf (stream, "Include stack depth: %d\n", set->depth);
- fprintf (stream, "Highest location: %u\n", set->highest_location);
+ fprintf (stream, "Highest location: %llu\n",
+ (unsigned long long) set->highest_location);
if (num_ordinary)
{
diff --git a/libcpp/macro.cc b/libcpp/macro.cc
index 907af87..0b8eebe 100644
--- a/libcpp/macro.cc
+++ b/libcpp/macro.cc
@@ -364,10 +364,10 @@ static cpp_hashnode* macro_of_context (cpp_context *context);
/* Statistical counter tracking the number of macros that got
expanded. */
-unsigned num_expanded_macros_counter = 0;
+line_map_uint_t num_expanded_macros_counter = 0;
/* Statistical counter tracking the total number tokens resulting
from macro expansion. */
-unsigned num_macro_tokens_counter = 0;
+line_map_uint_t num_macro_tokens_counter = 0;
/* Wrapper around cpp_get_token to skip CPP_PADDING tokens
and not consume CPP_EOF. */