Ping please? It would be great to tie up this loose end. Thanks!

https://gcc.gnu.org/pipermail/gcc-patches/2025-August/692261.html

-Lewis

On Sun, Oct 12, 2025 at 9:44 AM Lewis Hyatt <[email protected]> wrote:
>
> Hello-
>
> https://gcc.gnu.org/pipermail/gcc-patches/2025-August/692261.html
>
> Can I ping this one please? It fixes a small glitch with the
> transition to 64-bit location_t. I would like to have it for 16 and
> also 15 backport. Thanks!
>
> -Lewis
>
> On Sat, Aug 9, 2025 at 1:36 PM Lewis Hyatt <[email protected]> wrote:
> >
> > Hello-
> >
> > This fixes an ICE with -fdump-internal-locations that started with 64-bit
> > location_t support. That option is only really there for debugging, I
> > haven't seen any PR about it. But I would like also to backport it to 15.3
> > please. bootstrap + regtest all languages on x64-64 Linux looks good. OK?
> > Thanks!
> >
> > -Lewis
> >
> > -- >8 --
> >
> > When adding support for 64-bit location_t in GCC 15, I missed a couple
> > changes needed for the internal debugging tool -fdump-internal-locations to
> > work properly. This would previously ICE on a location_t large enough to
> > overflow a signed 32-bit int.
> >
> > gcc/ChangeLog:
> >
> >         * diagnostics/context.cc (num_digits): Change argument type from
> >         `int' to `uint64_t'.
> >         (test_num_digits): Add test for 64-bit argument.
> >         * diagnostic.h (num_digits): Adjust prototype.
> >         * input.cc (write_digit): Accept argument in range [0,10) instead of
> >         an arbitrary int.
> >         (write_digit_row): Adjust to change in write_digit().
> >
> > gcc/testsuite/ChangeLog:
> >
> >         * gcc.dg/plugin/location-overflow-test-3.c: New test.
> >         * gcc.dg/plugin/plugin.exp: Add the new test.
> > ---
> >  gcc/diagnostic.h                                       |  2 +-
> >  gcc/diagnostics/context.cc                             |  4 ++--
> >  gcc/input.cc                                           |  4 ++--
> >  gcc/testsuite/gcc.dg/plugin/location-overflow-test-3.c | 10 ++++++++++
> >  gcc/testsuite/gcc.dg/plugin/plugin.exp                 |  1 +
> >  5 files changed, 16 insertions(+), 5 deletions(-)
> >  create mode 100644 gcc/testsuite/gcc.dg/plugin/location-overflow-test-3.c
> >
> > diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h
> > index 7572e044cad..b8cbfad9826 100644
> > --- a/gcc/diagnostic.h
> > +++ b/gcc/diagnostic.h
> > @@ -275,7 +275,7 @@ option_unspecified_p (diagnostics::option_id opt_id)
> >  namespace diagnostics {
> >
> >  /* Compute the number of digits in the decimal representation of an 
> > integer.  */
> > -extern int num_digits (int);
> > +extern int num_digits (uint64_t);
> >
> >  extern char *get_cwe_url (int cwe);
> >  extern const char *maybe_line_and_column (int line, int col);
> > diff --git a/gcc/diagnostics/context.cc b/gcc/diagnostics/context.cc
> > index a1441ca5e73..5f08976d118 100644
> > --- a/gcc/diagnostics/context.cc
> > +++ b/gcc/diagnostics/context.cc
> > @@ -1448,11 +1448,10 @@ context::report_global_digraph (const 
> > lazily_created<digraphs::digraph> &ldg)
> >  /* Get the number of digits in the decimal representation of VALUE.  */
> >
> >  int
> > -num_digits (int value)
> > +num_digits (uint64_t value)
> >  {
> >    /* Perhaps simpler to use log10 for this, but doing it this way avoids
> >       using floating point.  */
> > -  gcc_assert (value >= 0);
> >
> >    if (value == 0)
> >      return 1;
> > @@ -2114,6 +2113,7 @@ test_num_digits ()
> >    ASSERT_EQ (7, num_digits (9999999));
> >    ASSERT_EQ (8, num_digits (10000000));
> >    ASSERT_EQ (8, num_digits (99999999));
> > +  ASSERT_EQ (20, num_digits (uint64_t (-1)));
> >  }
> >
> >  /* Run all of the selftests within this file.
> > diff --git a/gcc/input.cc b/gcc/input.cc
> > index b9a55395440..876d57a71e6 100644
> > --- a/gcc/input.cc
> > +++ b/gcc/input.cc
> > @@ -464,7 +464,7 @@ get_end_location (class line_maps *set, line_map_uint_t 
> > idx)
> >  static void
> >  write_digit (FILE *stream, int digit)
> >  {
> > -  fputc ('0' + (digit % 10), stream);
> > +  fputc ('0' + digit, stream);
> >  }
> >
> >  /* Helper function for dump_location_info.
> > @@ -481,7 +481,7 @@ write_digit_row (FILE *stream, int indent,
> >    for (int column = 1; column < max_col; column++)
> >      {
> >        location_t column_loc = loc + (location_t (column) << 
> > map->m_range_bits);
> > -      write_digit (stream, column_loc / divisor);
> > +      write_digit (stream, (column_loc / divisor) % 10);
> >      }
> >    fprintf (stream, "\n");
> >  }
> > diff --git a/gcc/testsuite/gcc.dg/plugin/location-overflow-test-3.c 
> > b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-3.c
> > new file mode 100644
> > index 00000000000..2acf1c3a1c8
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-3.c
> > @@ -0,0 +1,10 @@
> > +/* { dg-do compile } */
> > +/* { dg-options "-fplugin-arg-location_overflow_plugin-value=1024 
> > -fdump-internal-locations" } */
> > +
> > +/* The plugin arranges for location_t values to exceed 32 bits; verify the
> > +   internal dump routines don't crash. The exact output depends on the 
> > system
> > +   and on absolute path names, and this output is only meant for internal
> > +   purposes, so don't demand an exact form of the output.  */
> > +
> > +/* { dg-allow-blank-lines-in-output 1 } */
> > +/* { dg-prune-output ".*" } */
> > diff --git a/gcc/testsuite/gcc.dg/plugin/plugin.exp 
> > b/gcc/testsuite/gcc.dg/plugin/plugin.exp
> > index 3bb6063c3a9..5c780732ff1 100644
> > --- a/gcc/testsuite/gcc.dg/plugin/plugin.exp
> > +++ b/gcc/testsuite/gcc.dg/plugin/plugin.exp
> > @@ -141,6 +141,7 @@ set plugin_test_list [list \
> >      { location_overflow_plugin.cc \
> >           location-overflow-test-1.c \
> >           location-overflow-test-2.c \
> > +         location-overflow-test-3.c \
> >           location-overflow-test-pr83173.c \
> >           location-overflow-test-pr116047.c \
> >           location-overflow-test-pr120061.c } \

Reply via email to