On Sun, Nov 17, 2024 at 4:24 AM Lewis Hyatt <lhy...@gmail.com> wrote:
>
> 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.

This is OK if there's no comment from libcpp maintainers this week.

Thanks,
Richard.

> 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.
> ---
>  libcpp/include/line-map.h |  86 ++++++++++++++----------
>  libcpp/line-map.cc        | 138 ++++++++++++++++++++++----------------
>  libcpp/macro.cc           |   4 +-
>  3 files changed, 130 insertions(+), 98 deletions(-)
>
> diff --git a/libcpp/include/line-map.h b/libcpp/include/line-map.h
> index 732ec5e6445..96fdf60644f 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 ac765c78bf5..8ad31b1e755 100644
> --- a/libcpp/line-map.cc
> +++ b/libcpp/line-map.cc
> @@ -26,6 +26,10 @@ 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, since the size of a 
> location_t
> +   is configurable.  */
> +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 +49,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 +68,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 +201,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 +259,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 +343,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 +382,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 +412,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 +468,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 +508,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 +550,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 +577,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 +664,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 +711,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 +851,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 +901,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 +918,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 +998,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 +1016,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 +1056,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 +1072,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 +1123,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 +1141,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 +1170,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 +1195,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 +1536,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 location_diff_t res = l1 - 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 +1924,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 +1947,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 +1961,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 +2025,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 +2047,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 +2062,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 +2139,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 +2150,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 907af873df1..0b8eebee061 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.  */

Reply via email to