On Thu, 2021-03-04 at 16:17 +0000, Philip Herron wrote:
> In development of the Rust FE logging is useful in debugging. Instead
> of
> rolling our own logger it became clear the loggers part of analyzer
> and jit
> projects could be extracted and made generic so they could be reused
> in
> other projects.

Thanks for putting together this patch.

> To test this patch make check-jit was invoked, for analyzer the
> following
> flags were used -fanalyzer -fdump-analyzer -fanalyzer-verbosity=4.

"-fanalyzer-verbosity=" only affects what events appear in diagnostic
paths from the analyzer; it doesn't directly affect the logging (it
does indirectly, I suppose, since there are logging messages per-event
as they are processed)

> gcc/jit/ChangeLog:
> 
>         * jit-logging.h: has been extracted out to gcc/logging.h
> 
> gcc/analyzer/ChangeLog:
> 
>         * analyzer-logging.h: has been extract out to gcc/logging.h
> 
> gcc/ChangeLog:
> 
>         * logging.h: added new generic logger based off analyzer's
> logger

The ChangeLog entries are incomplete, and so the git hooks will
probably complain when you try to push this.

Various notes inline below...

[...snip...]
 
> diff --git a/gcc/analyzer/analyzer.h b/gcc/analyzer/analyzer.h
> index f50ac662516..87193268b10 100644
> --- a/gcc/analyzer/analyzer.h
> +++ b/gcc/analyzer/analyzer.h
> @@ -23,6 +23,16 @@ along with GCC; see the file COPYING3.  If not see
>  
>  class graphviz_out;
>  
> +namespace gcc {
> +  class logger;
> +  class log_scope;
> +  class log_user;
> +}
> +
> +using gcc::logger;
> +using gcc::log_scope;
> +using gcc::log_user;

Are the "using" decls for log_scope and log_user needed?  I know that
"logger" is used in a bunch of places, so the "using" decl for that is
probably useful, but my guess is that the other two are barely used in
the analyzer code, if at all.

[...]

> 
> diff --git a/gcc/analyzer/analyzer-logging.cc b/gcc/logging.c
> similarity index 76%
> rename from gcc/analyzer/analyzer-logging.cc
> rename to gcc/logging.c
> index 297319069f8..630a16d19dd 100644
> --- a/gcc/analyzer/analyzer-logging.cc
> +++ b/gcc/logging.c
[...]
>  /* Implementation of class logger.  */
>  
>  /* ctor for logger.  */
>  
> -logger::logger (FILE *f_out,
> -               int, /* flags */
> -               int /* verbosity */,
> -               const pretty_printer &reference_pp) :
> -  m_refcount (0),
> -  m_f_out (f_out),
> -  m_indent_level (0),
> -  m_log_refcount_changes (false),
> -  m_pp (reference_pp.clone ())
> +logger::logger (FILE *f_out, int, /* flags */
> +               int /* verbosity */, const pretty_printer
> *reference_pp,
> +               const char *module)
> +  : m_refcount (0), m_f_out (f_out), m_indent_level (0),
> +    m_log_refcount_changes (false), m_pp (reference_pp->clone ()),
> +    m_mod (module)
>  {
>    pp_show_color (m_pp) = 0;
>    pp_buffer (m_pp)->stream = f_out;
> @@ -61,6 +57,15 @@ logger::logger (FILE *f_out,
>    print_version (f_out, "", false);
>  }
>  
> +logger::logger (FILE *f_out, int, /* flags */
> +               int /* verbosity */, const char *module)
> +  : m_refcount (0), m_f_out (f_out), m_indent_level (0),
> +    m_log_refcount_changes (false), m_pp (nullptr), m_mod (module)
> +{
> +  /* Begin the log by writing the GCC version.  */
> +  print_version (f_out, "", false);
> +}

Both of these pass the empty string to print_version, but the to-be-
deleted implementation in jit-logging.c passed "JIT: ".  So I think
this one needs to read something like:

     print_version (f_out, m_mod ? m_mod : "", false);

or somesuch.

I'm probably bikeshedding, but could module/m_mod be renamed to
prefix/m_prefix?

I think it would be good to have a leading comment for this new ctor.
In particular, summarizing our discussion from github, something like:

/* logger ctor for use by libgccjit.

   The module param, if non-NULL, is printed as a prefix to all log
   messages.  This is particularly useful for libgccjit, where the
   log lines are often intermingled with messages from the program
   that libgccjit is linked into.  */

or somesuch.


[...]

> @@ -144,19 +152,27 @@ logger::log_partial (const char *fmt, ...)
>  void
>  logger::log_va_partial (const char *fmt, va_list *ap)
>  {
> -  text_info text;
> -  text.format_spec = fmt;
> -  text.args_ptr = ap;
> -  text.err_no = 0;
> -  pp_format (m_pp, &text);
> -  pp_output_formatted_text (m_pp);

I think there's an issue here: what format codes are accepted by this
function?

> +  if (!has_pretty_printer ())
> +    vfprintf (m_f_out, fmt, *ap);

...here we're formatting using vfprintf...

> +  else
> +    {
> +      text_info text;
> +      text.format_spec = fmt;
> +      text.args_ptr = ap;
> +      text.err_no = 0;
> +      pp_format (m_pp, &text);

...whereas here we're formatting using pp_format, which has different
conventions.

The jit implementation decls have e.g.:
   GNU_PRINTF(2, 3);
whereas the analyzer decls have e.g.:
   ATTRIBUTE_GCC_DIAG(2, 3);

I'm not quite sure how to square this circle - templates?  Gah.

I guess the analyzer implementation drifted away from the jit
implementation (the analyzer code was originally copied from the jit
code).  Sorry about that.

[...]

Hope this is constructive
Dave


Reply via email to