Hi, I think this one has fallen through the cracks, could someone please let me know if this is OK, or if there's something I need to do?
https://gcc.gnu.org/pipermail/gcc-patches/2026-June/719817.html Martyn On Tue, 2026-06-09 at 11:55 +0100, Martyn Welch wrote: > This patch picks up the work done by Julien Ruffin in: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56549#c6 > > _cpp_save_file_entries() in libcpp/files.cc currently saves the size > and > MD5 checksums of files without any encoding conversion or BOM removal > into the PCH's pchf_data structure. > > Later, when using a PCH, the compiler compares the metrics of the > files > it loads against those stored in the entries in the pchf_data > structure. > If it finds a match, the file is deemed to be in the PCH and the > compiler skips processing it further. See > check_file_against_entries() > for the implementation, also in files.cc. > > When f->buffer_valid is not true, the metrics stored in the PCH are > calculated from a raw read of the file in question, however the > buffers > with which it will be compared have been read in with read_file(). > This > uses _cpp_convert_input(), which strips out UTF BOM (Byte Order Mark) > and other ignored marker information. If a header contains a BOM, the > PCH entry will be recorded as 3 Bytes longer than the file loaded by > the > compiler via read_line() and the checksums will differ. > > Modify the process used to load the files when f->buffer_valid is not > true so that the same processing occurs, resulting in file sizes and > checksums that match. > > Signed-off-by: Martyn Welch <[email protected]> > --- > libcpp/files.cc | 21 +++++++++------------ > 1 file changed, 9 insertions(+), 12 deletions(-) > > diff --git a/libcpp/files.cc b/libcpp/files.cc > index 917b7799be9..f18ff05996a 100644 > --- a/libcpp/files.cc > +++ b/libcpp/files.cc > @@ -2724,19 +2724,16 @@ _cpp_save_file_entries (cpp_reader *pfile, > FILE *fp) > f->st.st_size, result->entries[count].sum); > else > { > - FILE *ff; > - int oldfd = f->fd; > + if (!read_file (pfile, f, 0)) > + return false; > > - if (!open_file (f)) > - { > - open_file_failed (pfile, f, 0, 0); > - free (result); > - return false; > - } > - ff = fdopen (f->fd, "rb"); > - md5_stream (ff, result->entries[count].sum); > - fclose (ff); > - f->fd = oldfd; > + md5_buffer ((const char *)f->buffer, > + f->st.st_size, result->entries[count].sum); > + const void* to_free = f->buffer_start; > + f->buffer_start = NULL; > + f->buffer = NULL; > + f->buffer_valid = false; > + free ((void*) to_free); > } > result->entries[count].size = f->st.st_size; > }
