[Mesa-stable] [Mesa-dev] [PATCH] glsl: fixer lexer for unreachable defines

Andres Gomez agomez at igalia.com
Fri Sep 7 09:20:24 UTC 2018


Pulled into staging/18.2. Thanks for the heads up.


On Thu, 2018-09-06 at 09:24 -0700, Dylan Baker wrote:
> Quoting Timothy Arceri (2018-09-05 19:40:34)
> > Cc: mesa-stable at lists.freedesktop.org
> > 
> > On 01/09/18 23:57, Timothy Arceri wrote:
> > > If we have something like:
> > > 
> > >     #ifdef NOT_DEFINED
> > >     #define A_MACRO(x) \
> > >       if (x)
> > >     #endif
> > > 
> > > The # on the #define is not skipped but the define itself is so
> > > this then gets recognised as #if.
> > > 
> > > Until 28a3731e3f this didn't happen because we ended up in
> > > <HASH>{NONSPACE} where BEGIN INITIAL was called stopping the
> > > problem from happening.
> > > 
> > > This change makes sure we never call RETURN_TOKEN_NEVER_SKIP for
> > > if/else/endif when processing a define.
> > > 
> > > Cc: Ian Romanick <idr at freedesktop.org>
> > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107772
> > > ---
> > >   src/compiler/glsl/glcpp/glcpp-lex.l | 60 ++++++++++++++++++-----------
> > >   src/compiler/glsl/glcpp/glcpp.h     |  1 +
> > >   2 files changed, 38 insertions(+), 23 deletions(-)
> > > 
> > > diff --git a/src/compiler/glsl/glcpp/glcpp-lex.l b/src/compiler/glsl/glcpp/glcpp-lex.l
> > > index fe5845acd4e..f7003da0cc8 100644
> > > --- a/src/compiler/glsl/glcpp/glcpp-lex.l
> > > +++ b/src/compiler/glsl/glcpp/glcpp-lex.l
> > > @@ -289,6 +289,7 @@ HEXADECIMAL_INTEGER       0[xX][0-9a-fA-F]+[uU]?
> > >            * token. */
> > >       if (parser->first_non_space_token_this_line) {
> > >               BEGIN HASH;
> > > +             yyextra->in_define = false;
> > >       }
> > >   
> > >       RETURN_TOKEN_NEVER_SKIP (HASH_TOKEN);
> > > @@ -336,43 +337,55 @@ HEXADECIMAL_INTEGER     0[xX][0-9a-fA-F]+[uU]?
> > >       /* For the pre-processor directives, we return these tokens
> > >        * even when we are otherwise skipping. */
> > >   <HASH>ifdef {
> > > -     BEGIN INITIAL;
> > > -     yyextra->lexing_directive = 1;
> > > -     yyextra->space_tokens = 0;
> > > -     RETURN_TOKEN_NEVER_SKIP (IFDEF);
> > > +     if (!yyextra->in_define) {
> > > +             BEGIN INITIAL;
> > > +             yyextra->lexing_directive = 1;
> > > +             yyextra->space_tokens = 0;
> > > +             RETURN_TOKEN_NEVER_SKIP (IFDEF);
> > > +     }
> > >   }
> > >   
> > >   <HASH>ifndef {
> > > -     BEGIN INITIAL;
> > > -     yyextra->lexing_directive = 1;
> > > -     yyextra->space_tokens = 0;
> > > -     RETURN_TOKEN_NEVER_SKIP (IFNDEF);
> > > +     if (!yyextra->in_define) {
> > > +             BEGIN INITIAL;
> > > +             yyextra->lexing_directive = 1;
> > > +             yyextra->space_tokens = 0;
> > > +             RETURN_TOKEN_NEVER_SKIP (IFNDEF);
> > > +     }
> > >   }
> > >   
> > >   <HASH>if/[^_a-zA-Z0-9] {
> > > -     BEGIN INITIAL;
> > > -     yyextra->lexing_directive = 1;
> > > -     yyextra->space_tokens = 0;
> > > -     RETURN_TOKEN_NEVER_SKIP (IF);
> > > +     if (!yyextra->in_define) {
> > > +             BEGIN INITIAL;
> > > +             yyextra->lexing_directive = 1;
> > > +             yyextra->space_tokens = 0;
> > > +             RETURN_TOKEN_NEVER_SKIP (IF);
> > > +     }
> > >   }
> > >   
> > >   <HASH>elif/[^_a-zA-Z0-9] {
> > > -     BEGIN INITIAL;
> > > -     yyextra->lexing_directive = 1;
> > > -     yyextra->space_tokens = 0;
> > > -     RETURN_TOKEN_NEVER_SKIP (ELIF);
> > > +     if (!yyextra->in_define) {
> > > +             BEGIN INITIAL;
> > > +             yyextra->lexing_directive = 1;
> > > +             yyextra->space_tokens = 0;
> > > +             RETURN_TOKEN_NEVER_SKIP (ELIF);
> > > +     }
> > >   }
> > >   
> > >   <HASH>else {
> > > -     BEGIN INITIAL;
> > > -     yyextra->space_tokens = 0;
> > > -     RETURN_TOKEN_NEVER_SKIP (ELSE);
> > > +     if (!yyextra->in_define) {
> > > +             BEGIN INITIAL;
> > > +             yyextra->space_tokens = 0;
> > > +             RETURN_TOKEN_NEVER_SKIP (ELSE);
> > > +     }
> > >   }
> > >   
> > >   <HASH>endif {
> > > -     BEGIN INITIAL;
> > > -     yyextra->space_tokens = 0;
> > > -     RETURN_TOKEN_NEVER_SKIP (ENDIF);
> > > +     if (!yyextra->in_define) {
> > > +             BEGIN INITIAL;
> > > +             yyextra->space_tokens = 0;
> > > +             RETURN_TOKEN_NEVER_SKIP (ENDIF);
> > > +     }
> > >   }
> > >   
> > >   <HASH>error[^\r\n]* {
> > > @@ -399,7 +412,8 @@ HEXADECIMAL_INTEGER       0[xX][0-9a-fA-F]+[uU]?
> > >        *        and not whitespace). This will generate an error.
> > >        */
> > >   <HASH>define{HSPACE}* {
> > > -     if (! parser->skipping) {
> > > +     yyextra->in_define = true;
> > > +     if (!parser->skipping) {
> > >               BEGIN DEFINE;
> > >               yyextra->space_tokens = 0;
> > >               RETURN_TOKEN (DEFINE_TOKEN);
> > > diff --git a/src/compiler/glsl/glcpp/glcpp.h b/src/compiler/glsl/glcpp/glcpp.h
> > > index c7e382ed30c..e786b24b132 100644
> > > --- a/src/compiler/glsl/glcpp/glcpp.h
> > > +++ b/src/compiler/glsl/glcpp/glcpp.h
> > > @@ -197,6 +197,7 @@ struct glcpp_parser {
> > >       int first_non_space_token_this_line;
> > >       int newline_as_space;
> > >       int in_control_line;
> > > +     bool in_define;
> > >       int paren_count;
> > >       int commented_newlines;
> > >       skip_node_t *skip_stack;
> > > 
> > 
> > _______________________________________________
> > mesa-stable mailing list
> > mesa-stable at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/mesa-stable
> 
> Staged for 18.1. CCing Andres.
> 
> Dylan
> _______________________________________________
> mesa-stable mailing list
> mesa-stable at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-stable
-- 
Br,

Andres


More information about the mesa-stable mailing list