It took me a bit to wrap my head around this, but I believe it's
correct.  It also fixes things like this (which we didn't notice were
broken):

#ifdef NOT_DEFINED
#define A_MACRO(x) \
#if 0
        x
#endif
#endif

Reviewed-by: Ian Romanick <ian.d.roman...@intel.com>

On 09/01/2018 06:57 AM, 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 <i...@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-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to