Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Simon Marchi <simon.marchi@polymtl.ca>
To: Pedro Alves <palves@redhat.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH] For flex: define YY_FATAL_ERROR, rename fprintf -> parser_fprintf
Date: Tue, 12 Mar 2019 21:32:00 -0000	[thread overview]
Message-ID: <e0d08a0dca3ef93bc18b6c6d9ee8d522@polymtl.ca> (raw)
In-Reply-To: <20190312182145.21611-1-palves@redhat.com>

On 2019-03-12 14:21, Pedro Alves wrote:
> Switching GDB to make use of gnulib's C++ namespace support mode
> revealed these direct uses of fprintf in the Ada lexer:
> 
>  In file included from ..../src/gdb/ada-exp.y:731:0:
>  ada-lex.c: In function ‘void yy_fatal_error(const char*)’:
>  ada-lex.c:2358:41: error: call to ‘fprintf’ declared with attribute
> warning: The symbol ::fprintf refers to the system function. Use
> gnulib::fprintf instead. [-Werror]
>      (void) fprintf( stderr, "%s\n", msg );
> 					  ^
> 
> The generated yy_fatal_error looks like this with flex 2.5.35:
> 
>  static void yy_fatal_error (yyconst char* msg )
>  {
> 			 (void) fprintf( stderr, "%s\n", msg );
> 	 exit( YY_EXIT_FAILURE );
>  }
> 
> We can define YY_FATAL_ERROR to override that default implementation.
> 
> I think it's a good idea to do that and call internal_error instead of
> exiting gdb, so this is what this patch does.
> 
> However, the default implementation is still generated and
> unconditionally compiled in, so we need to handle that fprintf somehow
> too.  gnulib's C++ namespace support adds that useful warning shown
> above, breaking the build if we don't do anything here.
> 
> So this commit uses sed to replace fprintf calls with parser_fprintf
> calls, like we already do to rewire malloc to xmalloc, etc.
> 
> gdb/ChangeLog:
> yyyy-mm-dd  Pedro Alves  <palves@redhat.com>
> 
> 	* Makefile.in (.l.c): Replace fprintf calls with parser_fprintf
> 	calls.
> 	* yy-remap.h (YY_FATAL_ERROR): Define.
> ---
>  gdb/Makefile.in | 28 ++++++++++++++++++++++++----
>  gdb/yy-remap.h  |  2 ++
>  2 files changed, 26 insertions(+), 4 deletions(-)
> 
> diff --git a/gdb/Makefile.in b/gdb/Makefile.in
> index 5614cc3386..aa01c8d38e 100644
> --- a/gdb/Makefile.in
> +++ b/gdb/Makefile.in
> @@ -2457,10 +2457,28 @@ po/$(PACKAGE).pot: force
>  # LANG-exp.c is generated in objdir from LANG-exp.y if it doesn't
>  # exist in srcdir, then compiled in objdir to LANG-exp.o.  If we
>  # said LANG-exp.c rather than ./c-exp.c some makes would
> -# sometimes re-write it into $(srcdir)/c-exp.c.  Remove bogus
> -# decls for malloc/realloc/free which conflict with everything else.
> -# Strictly speaking c-exp.c should therefore depend on
> -# Makefile.in, but that was a pretty big annoyance.
> +# sometimes re-write it into $(srcdir)/c-exp.c.
> +#
> +# Remove bogus decls for malloc/realloc/free which conflict with
> +# everything else.
> +#
> +# Replace calls to fprintf in order to redirect stderr -> gdb_stderr.
> +#
> +# We define YY_FATAL_ERROR to hook in our replacement, however, flex
> +# still defines the default version anyway, as a static function,
> +# leading to -Wunused-function warnings, like:
> +#
> +#  ada-lex.c:2329:13: error: ‘void yy_fatal_error(const char*)’
> defined but not used [-Werror=unused-function]
> +#
> +# Observed with flex 2.5.35.  And then with flex 2.6.1 we have:
> +#
> +#      ada-lex.c:#define yynoreturn __attribute__((__noreturn__))
> +#      ada-lex.c:static void yynoreturn yy_fatal_error (yyconst char* 
> msg )
> +#
> +# Fix that by injecting ATTRIBUTE_UNUSED into yy_fatal_error's 
> prototype.
> +#
> +# Strictly speaking c-exp.c should therefore depend on Makefile.in,
> +# but that was a pretty big annoyance.
> 
>  %.c: %.y
>  	$(ECHO_YACC) $(SHELL) $(YLWRAP) $< y.tab.c $@.tmp -- \
> @@ -2489,6 +2507,8 @@ po/$(PACKAGE).pot: force
>  	        -e 's/\([ \t;,(]\)free\([ \t]*[&(),]\)/\1xfree\2/g' \
>  	        -e 's/\([ \t;,(]\)free$$/\1xfree/g' \
>  		-e 's/yy_flex_xrealloc/yyxrealloc/g' \
> +		-e 's/\([ \t;,(]\)fprintf/\1parser_fprintf/g' \
> +		-e 's/\(static void\) \(yynoreturn \)\?\(yy_fatal_error\)/\1
> ATTRIBUTE_UNUSED \2\3/g' \
>  	      > $@.new && \
>  	    mv $@.new $@
> 
> diff --git a/gdb/yy-remap.h b/gdb/yy-remap.h
> index cdd0aae8c6..ba62adbbfd 100644
> --- a/gdb/yy-remap.h
> +++ b/gdb/yy-remap.h
> @@ -96,4 +96,6 @@
>  # define YYFPRINTF parser_fprintf
>  #endif
> 
> +#define YY_FATAL_ERROR(msg) internal_error (__FILE__, __LINE__, msg)
> +
>  #endif /* YY_REMAP_H */

This LGTM.

Simon


  reply	other threads:[~2019-03-12 21:32 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-12 18:21 Pedro Alves
2019-03-12 21:32 ` Simon Marchi [this message]
  -- strict thread matches above, loose matches on Subject: below --
2016-11-17 15:05 Pedro Alves

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e0d08a0dca3ef93bc18b6c6d9ee8d522@polymtl.ca \
    --to=simon.marchi@polymtl.ca \
    --cc=gdb-patches@sourceware.org \
    --cc=palves@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox