On Sat, 2025-01-25 at 23:31 -0800, Andi Kleen wrote:
> From: Andi Kleen <[email protected]>
Thanks for writing the test case!
Some nitpicks...
>
> gcc/ChangeLog:
>
> * input.cc (check_line): New.
> (test_replacement): New function to test line caching.
> (input_cc_tests): Call test_replacement
> ---
> gcc/input.cc | 46 ++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 46 insertions(+)
>
> diff --git a/gcc/input.cc b/gcc/input.cc
> index f1a15de66f1..524d5d2b6d1 100644
> --- a/gcc/input.cc
> +++ b/gcc/input.cc
> @@ -2346,6 +2346,51 @@ test_make_location_nonpure_range_endpoints
> (const line_table_case &case_)
> ASSERT_FALSE (IS_ADHOC_LOC (get_finish (not_aaa_eq_bbb)));
> }
>
> +/* Verify reading of a specific line LINENUM in TMP, FC. */
> +
> +static void check_line (temp_source_file &tmp, file_cache &fc, int
> linenum)
> +{
> + char_span line = fc.get_source_line (tmp.get_filename (),
> linenum);
> + int n;
> + ASSERT_TRUE (sscanf (line.get_buffer (), "%d", &n) == 1);
Please add a comment around here something like:
/* Although get_buffer's result isn't guaranteed to be
null-terminated, it will be for every line in test_replacement. */
or somesuch.
> + ASSERT_EQ (n, linenum);
> +}
> +
> +/* Test file cache replacement. */
> +
> +static void test_replacement ()
> +{
> + const int maxline = 1000;
> + char *vec = XNEWVEC (char, maxline * 15);
> + char *p = vec;
> + int i;
> + for (i = 1; i <= maxline; i++)
> + {
> + p += sprintf (p, "%d\n", i);
> + }
> + temp_source_file tmp (SELFTEST_LOCATION, ".txt", vec);
> + free (vec);
> + file_cache fc;
> +
> + for (i = 2; i <= maxline; i++)
> + {
> + check_line (tmp, fc, i);
> + check_line (tmp, fc, i - 1);
> + if (i >= 10)
> + check_line (tmp, fc, i - 9);
> + if (i >= 350) /* Exceed the look behind cache. */
> + check_line (tmp, fc, i - 300);
> + }
> + for (i = 5; i <= maxline; i += 100)
> + {
> + check_line (tmp, fc, i);
> + }
> + for (i = 1; i <= maxline; i++)
> + {
> + check_line (tmp, fc, i);
> + }
Probably should lose the {} around the single statement being guarded
by the "if" in these two loops.
Patch 7 is OK otherwise, and I'm taking a look at the rest of the
patches now; thanks.
Dave
> +}
> +
> /* Verify reading of input files (e.g. for caret-based
> diagnostics). */
>
> static void
> @@ -4296,6 +4341,7 @@ input_cc_tests ()
>
> test_reading_source_line ();
> test_reading_source_buffer ();
> + test_replacement ();
>
> test_line_offset_overflow ();
>