public inbox for jit@gcc.gnu.org
 help / color / mirror / Atom feed
* Re: [PATCH] toplev: gcc version information for jit
  2015-01-01  0:00 [PATCH] toplev: gcc version information for jit David Malcolm
@ 2015-01-01  0:00 ` Jeff Law
  0 siblings, 0 replies; 2+ messages in thread
From: Jeff Law @ 2015-01-01  0:00 UTC (permalink / raw)
  To: David Malcolm, jit, gcc-patches

On 01/23/15 13:06, David Malcolm wrote:
> 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.
OK.  It's a bit out of scope for stage4, but I'll gate it in.

jeff

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [PATCH] toplev: gcc version information for jit
@ 2015-01-01  0:00 David Malcolm
  2015-01-01  0:00 ` Jeff Law
  0 siblings, 1 reply; 2+ messages in thread
From: David Malcolm @ 2015-01-01  0:00 UTC (permalink / raw)
  To: jit, gcc-patches; +Cc: David Malcolm

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

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-01-26 22:19 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-01  0:00 [PATCH] toplev: gcc version information for jit David Malcolm
2015-01-01  0:00 ` Jeff Law

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).