diff mbox

[committed] Evict selftest tempfiles from the diagnostics file cache

Message ID 1471527540-62014-1-git-send-email-dmalcolm@redhat.com
State New
Headers show

Commit Message

David Malcolm Aug. 18, 2016, 1:39 p.m. UTC
Selftests can use class selftest::temp_source_file to write out files
for testing input-handling, and the files are unlinked in the dtor.

This leads to stale entries in input.c's cache of file content, which
could lead to errors if a temporary filename gets reused during a run
of the selftests.

We don't normally expect files to be "deleted from under us", so
special-case this by adding a special way for temp_source_file's
dtor to purge any cache entries referring to it.

Successfully bootstrapped&regrtested on x86_64-pc-linux-gnu.

Committed to trunk as r239570.

gcc/ChangeLog:
	* input.c (diagnostics_file_cache_forcibly_evict_file): New
	function.
	* input.h (diagnostics_file_cache_forcibly_evict_file): New
	declaration.
	* selftest.c (selftest::temp_source_file::~temp_source_file):
	Evict m_filename from the diagnostic file cache.
---
 gcc/input.c    | 26 ++++++++++++++++++++++++++
 gcc/input.h    |  2 ++
 gcc/selftest.c |  1 +
 3 files changed, 29 insertions(+)
diff mbox

Patch

diff --git a/gcc/input.c b/gcc/input.c
index 172d13a..76a3307 100644
--- a/gcc/input.c
+++ b/gcc/input.c
@@ -249,6 +249,32 @@  lookup_file_in_cache_tab (const char *file_path)
   return r;
 }
 
+/* Purge any mention of FILENAME from the cache of files used for
+   printing source code.  For use in selftests when working
+   with tempfiles.  */
+
+void
+diagnostics_file_cache_forcibly_evict_file (const char *file_path)
+{
+  gcc_assert (file_path);
+
+  fcache *r = lookup_file_in_cache_tab (file_path);
+  if (!r)
+    /* Not found.  */
+    return;
+
+  r->file_path = NULL;
+  if (r->fp)
+    fclose (r->fp);
+  r->fp = NULL;
+  r->nb_read = 0;
+  r->line_start_idx = 0;
+  r->line_num = 0;
+  r->line_record.truncate (0);
+  r->use_count = 0;
+  r->total_lines = 0;
+}
+
 /* Return the file cache that has been less used, recently, or the
    first empty one.  If HIGHEST_USE_COUNT is non-null,
    *HIGHEST_USE_COUNT is set to the highest use count of the entries
diff --git a/gcc/input.h b/gcc/input.h
index c17e440..0f187c7 100644
--- a/gcc/input.h
+++ b/gcc/input.h
@@ -95,6 +95,8 @@  void dump_location_info (FILE *stream);
 
 void diagnostics_file_cache_fini (void);
 
+void diagnostics_file_cache_forcibly_evict_file (const char *file_path);
+
 struct GTY(()) string_concat
 {
   string_concat (int num, location_t *locs);
diff --git a/gcc/selftest.c b/gcc/selftest.c
index 0a7192e..d25f5c0 100644
--- a/gcc/selftest.c
+++ b/gcc/selftest.c
@@ -111,6 +111,7 @@  selftest::temp_source_file::temp_source_file (const location &loc,
 selftest::temp_source_file::~temp_source_file ()
 {
   unlink (m_filename);
+  diagnostics_file_cache_forcibly_evict_file (m_filename);
   free (m_filename);
 }