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;
>      }

Reply via email to