This patch is Reviewed-by: Ian Romanick <ian.d.roman...@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 <tarc...@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); > } > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev