On Wed, 6 Aug 2025, Jakub Jelinek wrote:

> Hi!
> 
> OpenBSD headers apparently instead of just
>  #define SIZE_MAX something
> do
>  #ifndef SIZE_MAX
>  #define SIZE_MAX something
>  #endif
> This causes problem with gengtype-lex.cc, where the flex generated
> code has
>  #ifndef SIZE_MAX
>  #define SIZE_MAX (~(size_t)0)
>  #endif
> and system.h is included only after that and since my changes for
> host size_t *printf printing SIZE_MAX is used in preprocessor
> expressions,
>  #if SIZE_MAX <= UINT_MAX
> etc.
> In the preprocessor, identifiers are replaced with 0 and so
> it is (~(0)0) <= 0xffffffffU
> or so and thus invalid.
> 
> Now, normally we want to include system.h early, ideally immediately
> after config.h or bconfig.h, but in gengtype-lex.cc case we have
>  #ifdef HOST_GENERATOR_FILE
>  #include "config.h"
>  #define GENERATOR_FILE 1
>  #else
>  #include "bconfig.h"
>  #endif
> 
>  // flex generated start of file, including
>  #include <stdio.h>
>  #include <string.h>
>  #include <errno.h>
>  #include <stdlib.h>
>  #include <inttypes.h>
>  #ifndef SIZE_MAX
>  #define SIZE_MAX (~(size_t)0)
>  #endif
> 
>  // start of gengtype-lex.l %{} section
>  #ifdef HOST_GENERATOR_FILE
>  #include "config.h"
>  #define GENERATOR_FILE 1
>  #else
>  #include "bconfig.h"
>  #endif
>  #include "system.h"
> 
>  #define malloc xmalloc
>  #define realloc xrealloc
> 
>  #include "gengtype.h"
> 
> As I'm not sure what flex we require for building gcc (%top{} which COBOL FE
> *.l uses is only in flex from 2003-04-01), the patch keeps using the %top{}
> done by hand in Makefile.in, but includes system.h in the top part, with
> FLEX_SCANNER temporarily defined (I'm undefining it afterwards because
> flex generated code defines it again and I don't want to guarantee it is
> defined to the same value) so that malloc/realloc poisoning doesn't happen
> and #define malloc xmalloc and realloc xrealloc are done in system.h.
> Note, system.h already includes all the 5 headers flex generated code
> includes.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Richard.

> 2025-08-06  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR bootstrap/121386
>       * Makefile.in (gengtype-lex.cc): Append #define FLEX_SCANNER,
>       #include "system.h" and #undef FLEX_SCANNER to the prepended lines.
>       * gengtype-lex.l: Remove inclusion of config.h or bconfig.h, system.h
>       and definition of malloc/realloc from %{} section.
> 
> --- gcc/Makefile.in.jj        2025-07-30 13:40:57.287535441 +0200
> +++ gcc/Makefile.in   2025-08-05 11:32:48.036425630 +0200
> @@ -3402,6 +3402,9 @@ gengtype-lex.cc : gengtype-lex.l
>         echo '#else'                     >> $@.tmp; \
>         echo '#include "bconfig.h"'      >> $@.tmp; \
>         echo '#endif'                    >> $@.tmp; \
> +       echo '#define FLEX_SCANNER'      >> $@.tmp; \
> +       echo '#include "system.h"'       >> $@.tmp; \
> +       echo '#undef FLEX_SCANNER'       >> $@.tmp; \
>         cat $@ >> $@.tmp; \
>         mv $@.tmp $@; \
>       }
> --- gcc/gengtype-lex.l.jj     2025-08-04 14:24:43.961182699 +0200
> +++ gcc/gengtype-lex.l        2025-08-05 11:33:20.234994359 +0200
> @@ -21,17 +21,6 @@ along with GCC; see the file COPYING3.
>  %option noinput
>  
>  %{
> -#ifdef HOST_GENERATOR_FILE
> -#include "config.h"
> -#define GENERATOR_FILE 1
> -#else
> -#include "bconfig.h"
> -#endif
> -#include "system.h"
> -
> -#define malloc xmalloc
> -#define realloc xrealloc
> -
>  #include "gengtype.h"
>  
>  #define YY_DECL int yylex (const char **yylval)
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to