On Sat, 2025-01-25 at 23:31 -0800, Andi Kleen wrote: > From: Andi Kleen <a...@gcc.gnu.org>
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 (); >