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_file() 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.
libcpp/ChangeLog:
PR preprocessor/56549
* files.cc (_cpp_save_file_entries): Use read_file so PCH
entries account for BOM removal and encoding conversion.
Signed-off-by: Martyn Welch <[email protected]>
---
Changes in v2:
- Add changelog and PR information to commit message
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;
}
--
2.53.0