[Mesa-dev] [PATCH] glcpp: Avoid unnecessary call to strlen

Thomas Helland thomashelland90 at gmail.com
Tue Sep 26 16:50:41 UTC 2017


I've now pushed the series, so feel free to rebase =)

2017-09-22 16:10 GMT+02:00 Ian Romanick <idr at freedesktop.org>:
> This patch is
>
> Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
>
> I have a couple patches that go on top of this particular patch, and I'd
> rather rebase before I send them out for review. :)
>
> On 09/14/2017 03:39 PM, Thomas Helland wrote:
>> Length of the token was already calculated by flex and stored in yyleng,
>> no need to implicitly call strlen() via linear_strdup().
>>
>> Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
>> Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
>>
>> V2: Also convert this pattern in glsl_lexer.ll
>>
>> V3: Remove a misplaced comment
>>
>> V4: Use a temporary char to avoid type change
>>     Remove bogus +1 on length check of identifier
>> ---
>>  src/compiler/glsl/glcpp/glcpp-lex.l |  9 ++++++++-
>>  src/compiler/glsl/glsl_lexer.ll     | 39 +++++++++++++++++++++++++++++--------
>>  2 files changed, 39 insertions(+), 9 deletions(-)
>>
>> diff --git a/src/compiler/glsl/glcpp/glcpp-lex.l b/src/compiler/glsl/glcpp/glcpp-lex.l
>> index 381b97364a..9cfcc12022 100644
>> --- a/src/compiler/glsl/glcpp/glcpp-lex.l
>> +++ b/src/compiler/glsl/glcpp/glcpp-lex.l
>> @@ -101,7 +101,14 @@ void glcpp_set_column (int  column_no , yyscan_t yyscanner);
>>  #define RETURN_STRING_TOKEN(token)                                   \
>>       do {                                                            \
>>               if (! parser->skipping) {                               \
>> -                     yylval->str = linear_strdup(yyextra->linalloc, yytext); \
>> +                     /* We're not doing linear_strdup here, to avoid \
>> +                      * an implicit call on strlen() for the length  \
>> +                      * of the string, as this is already found by   \
>> +                      * flex and stored in yyleng */                 \
>> +                     void *mem_ctx = yyextra->linalloc;              \
>> +                     yylval->str = linear_alloc_child(mem_ctx,       \
>> +                                                      yyleng + 1);   \
>> +                     memcpy(yylval->str, yytext, yyleng + 1);        \
>>                       RETURN_TOKEN_NEVER_SKIP (token);                \
>>               }                                                       \
>>       } while(0)
>> diff --git a/src/compiler/glsl/glsl_lexer.ll b/src/compiler/glsl/glsl_lexer.ll
>> index 7c41455d98..56519bf92d 100644
>> --- a/src/compiler/glsl/glsl_lexer.ll
>> +++ b/src/compiler/glsl/glsl_lexer.ll
>> @@ -81,8 +81,13 @@ static int classify_identifier(struct _mesa_glsl_parse_state *, const char *);
>>                         "illegal use of reserved word `%s'", yytext); \
>>        return ERROR_TOK;                                              \
>>        } else {                                                               \
>> -      void *mem_ctx = yyextra->linalloc;                                     \
>> -      yylval->identifier = linear_strdup(mem_ctx, yytext);           \
>> +      /* We're not doing linear_strdup here, to avoid an implicit    \
>> +       * call on strlen() for the length of the string, as this is   \
>> +       * already found by flex and stored in yyleng */               \
>> +      void *mem_ctx = yyextra->linalloc;                             \
>> +         char *id = (char *) linear_alloc_child(mem_ctx, yyleng + 1);   \
>> +         memcpy(id, yytext, yyleng + 1);                                \
>> +         yylval->identifier = id;                                       \
>>        return classify_identifier(yyextra, yytext);                   \
>>        }                                                                      \
>>     } while (0)
>> @@ -261,8 +266,14 @@ HASH             ^{SPC}#{SPC}
>>  <PP>[ \t\r]*                 { }
>>  <PP>:                                return COLON;
>>  <PP>[_a-zA-Z][_a-zA-Z0-9]*   {
>> -                                void *mem_ctx = yyextra->linalloc;
>> -                                yylval->identifier = linear_strdup(mem_ctx, yytext);
>> +                                /* We're not doing linear_strdup here, to avoid an implicit call
>> +                                 * on strlen() for the length of the string, as this is already
>> +                                 * found by flex and stored in yyleng
>> +                                 */
>> +                                    void *mem_ctx = yyextra->linalloc;
>> +                                    char *id = (char *) linear_alloc_child(mem_ctx, yyleng + 1);
>> +                                    memcpy(id, yytext, yyleng + 1);
>> +                                    yylval->identifier = id;
>>                                  return IDENTIFIER;
>>                               }
>>  <PP>[1-9][0-9]*                      {
>> @@ -449,8 +460,14 @@ layout           {
>>                        || yyextra->ARB_tessellation_shader_enable) {
>>                     return LAYOUT_TOK;
>>                  } else {
>> -                   void *mem_ctx = yyextra->linalloc;
>> -                   yylval->identifier = linear_strdup(mem_ctx, yytext);
>> +                   /* We're not doing linear_strdup here, to avoid an implicit call
>> +                    * on strlen() for the length of the string, as this is already
>> +                    * found by flex and stored in yyleng
>> +                    */
>> +                      void *mem_ctx = yyextra->linalloc;
>> +                      char *id = (char *) linear_alloc_child(mem_ctx, yyleng + 1);
>> +                      memcpy(id, yytext, yyleng + 1);
>> +                      yylval->identifier = id;
>>                     return classify_identifier(yyextra, yytext);
>>                  }
>>               }
>> @@ -621,12 +638,18 @@ u64vec4         KEYWORD_WITH_ALT(0, 0, 0, 0, yyextra->ARB_gpu_shader_int64_enable, U64V
>>  [_a-zA-Z][_a-zA-Z0-9]*       {
>>                           struct _mesa_glsl_parse_state *state = yyextra;
>>                           void *ctx = state->linalloc;
>> -                         if (state->es_shader && strlen(yytext) > 1024) {
>> +                         if (state->es_shader && yyleng > 1024) {
>>                              _mesa_glsl_error(yylloc, state,
>>                                               "Identifier `%s' exceeds 1024 characters",
>>                                               yytext);
>>                           } else {
>> -                           yylval->identifier = linear_strdup(ctx, yytext);
>> +                           /* We're not doing linear_strdup here, to avoid an implicit call
>> +                            * on strlen() for the length of the string, as this is already
>> +                            * found by flex and stored in yyleng
>> +                            */
>> +                              char *id = (char *) linear_alloc_child(ctx, yyleng + 1);
>> +                              memcpy(id, yytext, yyleng + 1);
>> +                              yylval->identifier = id;
>>                           }
>>                           return classify_identifier(state, yytext);
>>                       }
>>
>


More information about the mesa-dev mailing list