[PATCH] toplev: gcc version information for jit

David Malcolm dmalcolm@redhat.com
Fri Jan 23 21:20:00 GMT 2015


libgccjit can print detailed logs and generate testcases for
reproducing bugs (using gcc_jit_context_set_logfile and
gcc_jit_context_dump_reproducer_to_file respectively).

It strikes me that such files really ought to contain version
information, so the following patch adds calls to print_version in both
places.

This requires touching toplev.c/h to add a flag to print_version, since
it accesses global variables.  The relevant logging calls in libgccjit are
from regions that don't hold the mutex on gcc's state, and so we have to
skip logging those parts of the version info.

Passes "make check-jit".

OK for stage 4, assuming bootstrap&regrtest?

gcc/ChangeLog:
	* toplev.c (print_version): Add param "show_global_state", and
	only print GGC and plugin information if it is true.
	(init_asm_output): Pass in "true" for the new param when calling
	print_version.
	(process_options): Likewise.
	(toplev::main): Likewise.
	* toplev.h (print_version): Add new param to decl.

gcc/jit/ChangeLog:
	* docs/internals/test-hello-world.exe.log.txt: Add example version
	lines.
	* jit-common.h (gcc::jit::dump::get_file): New accessor.
	* jit-logging.c: Include toplev.h.
	(gcc::jit::logger::logger): Log the GCC version.
	* jit-recording.c: Include toplev.h.
	(gcc:jit::recording::context::dump_reproducer_to_file): Log the
	GCC version.
---
 .../docs/internals/test-hello-world.exe.log.txt    |  2 ++
 gcc/jit/jit-common.h                               |  2 ++
 gcc/jit/jit-logging.c                              |  3 ++
 gcc/jit/jit-recording.c                            |  5 +++-
 gcc/toplev.c                                       | 33 +++++++++++++++-------
 gcc/toplev.h                                       |  2 +-
 6 files changed, 35 insertions(+), 12 deletions(-)

diff --git a/gcc/jit/docs/internals/test-hello-world.exe.log.txt b/gcc/jit/docs/internals/test-hello-world.exe.log.txt
index 205b6b4..876d830 100644
--- a/gcc/jit/docs/internals/test-hello-world.exe.log.txt
+++ b/gcc/jit/docs/internals/test-hello-world.exe.log.txt
@@ -1,3 +1,5 @@
+JIT: libgccjit (GCC) version 5.0.0 20150123 (experimental) (x86_64-unknown-linux-gnu)
+JIT:	compiled by GNU C version 4.8.3 20140911 (Red Hat 4.8.3-7), GMP version 5.1.2, MPFR version 3.1.2, MPC version 1.0.1
 JIT: entering: gcc_jit_context_set_str_option
 JIT: exiting: gcc_jit_context_set_str_option
 JIT: entering: gcc_jit_context_set_int_option
diff --git a/gcc/jit/jit-common.h b/gcc/jit/jit-common.h
index 09d63ba..8753651 100644
--- a/gcc/jit/jit-common.h
+++ b/gcc/jit/jit-common.h
@@ -178,6 +178,8 @@ public:
   recording::location *
   make_location () const;
 
+  FILE *get_file () const { return m_file; }
+
 private:
   recording::context &m_ctxt;
   const char *m_filename;
diff --git a/gcc/jit/jit-logging.c b/gcc/jit/jit-logging.c
index 61b898b..22ab6fd 100644
--- a/gcc/jit/jit-logging.c
+++ b/gcc/jit/jit-logging.c
@@ -21,6 +21,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
+#include "toplev.h" /* for print_version */
 
 #include "jit-logging.h"
 
@@ -41,6 +42,8 @@ logger::logger (FILE *f_out,
   m_indent_level (0),
   m_log_refcount_changes (false)
 {
+  /* Begin the log by writing the GCC version.  */
+  print_version (f_out, "JIT:", false);
 }
 
 /* The destructor for gcc::jit::logger, invoked via
diff --git a/gcc/jit/jit-recording.c b/gcc/jit/jit-recording.c
index 1077f27..9f6e5fd 100644
--- a/gcc/jit/jit-recording.c
+++ b/gcc/jit/jit-recording.c
@@ -24,6 +24,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "tm.h"
 #include "pretty-print.h"
 #include "hash-map.h"
+#include "toplev.h"
 
 #include <pthread.h>
 
@@ -1414,7 +1415,9 @@ recording::context::dump_reproducer_to_file (const char *path)
 	      == contexts[0]);
 
   r.write ("/* This code was autogenerated by"
-	   " gcc_jit_context_dump_reproducer_to_file.  */\n\n");
+	   " gcc_jit_context_dump_reproducer_to_file.\n\n");
+  print_version (r.get_file (), "  ", false);
+  r.write ("*/\n");
   r.write ("#include <libgccjit.h>\n\n");
   r.write ("static void\nset_options (");
   r.write_params (contexts);
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 15b85e1..072c5ab 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -728,10 +728,19 @@ compile_file (void)
 
 /* Print version information to FILE.
    Each line begins with INDENT (for the case where FILE is the
-   assembler output file).  */
+   assembler output file).
+
+   If SHOW_GLOBAL_STATE is true (for cc1 etc), we are within the compiler
+   proper and can print pertinent state (e.g. params and plugins).
+
+   If SHOW_GLOBAL_STATE is false (for use by libgccjit), we are outside the
+   compiler, and we don't hold the mutex on the compiler's global state:
+   we can't print params and plugins, since they might not be initialized,
+   or might be being manipulated by a compile running in another
+   thread.  */
 
 void
-print_version (FILE *file, const char *indent)
+print_version (FILE *file, const char *indent, bool show_global_state)
 {
   static const char fmt1[] =
 #ifdef __GNUC__
@@ -791,12 +800,16 @@ print_version (FILE *file, const char *indent)
 	     file == stderr ? _(fmt3) : fmt3,
 	     indent, *indent != 0 ? " " : "",
 	     "MPC", MPC_VERSION_STRING, mpc_get_version ());
-  fprintf (file,
-	   file == stderr ? _(fmt4) : fmt4,
-	   indent, *indent != 0 ? " " : "",
-	   PARAM_VALUE (GGC_MIN_EXPAND), PARAM_VALUE (GGC_MIN_HEAPSIZE));
 
-  print_plugins_versions (file, indent);
+  if (show_global_state)
+    {
+      fprintf (file,
+	       file == stderr ? _(fmt4) : fmt4,
+	       indent, *indent != 0 ? " " : "",
+	       PARAM_VALUE (GGC_MIN_EXPAND), PARAM_VALUE (GGC_MIN_HEAPSIZE));
+
+      print_plugins_versions (file, indent);
+    }
 }
 
 static int
@@ -1008,7 +1021,7 @@ init_asm_output (const char *name)
 	{
 	  /* Print the list of switches in effect
 	     into the assembler file as comments.  */
-	  print_version (asm_out_file, ASM_COMMENT_START);
+	  print_version (asm_out_file, ASM_COMMENT_START, true);
 	  print_switch_values (print_to_asm_out_file);
 	  putc ('\n', asm_out_file);
 	}
@@ -1423,7 +1436,7 @@ process_options (void)
      option flags in use.  */
   if (version_flag)
     {
-      print_version (stderr, "");
+      print_version (stderr, "", true);
       if (! quiet_flag)
 	print_switch_values (print_to_stderr);
     }
@@ -2131,7 +2144,7 @@ toplev::main (int argc, char **argv)
   initialize_plugins ();
 
   if (version_flag)
-    print_version (stderr, "");
+    print_version (stderr, "", true);
 
   if (help_flag)
     print_plugins_help (stderr, "");
diff --git a/gcc/toplev.h b/gcc/toplev.h
index 5503795..6dac846 100644
--- a/gcc/toplev.h
+++ b/gcc/toplev.h
@@ -78,7 +78,7 @@ extern bool user_defined_section_attribute;
 /* See toplev.c.  */
 extern int flag_rerun_cse_after_global_opts;
 
-extern void print_version (FILE *, const char *);
+extern void print_version (FILE *, const char *, bool);
 
 /* The hashtable, so that the C front ends can pass it to cpplib.  */
 extern struct ht *ident_hash;
-- 
1.8.5.3



More information about the Gcc-patches mailing list