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 Fix compile warning from V2 --- src/compiler/glsl/glcpp/glcpp-lex.l | 9 +- src/compiler/glsl/glsl_lexer.ll | 32 ++++- src/compiler/glsl/glsl_parser.yy | 246 ++++++++++++++++++------------------ 3 files changed, 157 insertions(+), 130 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..3a67f0ea40 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; \ + yylval->identifier = (char *) linear_alloc_child(mem_ctx, \ + yyleng + 1); \ + memcpy(yylval->identifier, yytext, yyleng + 1); \ return classify_identifier(yyextra, yytext); \ } \ } while (0) @@ -261,8 +266,13 @@ HASH ^{SPC}#{SPC} <PP>[ \t\r]* { } <PP>: return COLON; <PP>[_a-zA-Z][_a-zA-Z0-9]* { + /* 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->identifier = linear_strdup(mem_ctx, yytext); + yylval->identifier = (char *) linear_alloc_child(mem_ctx, yyleng + 1); + memcpy(yylval->identifier, yytext, yyleng + 1); return IDENTIFIER; } <PP>[1-9][0-9]* { @@ -449,8 +459,13 @@ layout { || yyextra->ARB_tessellation_shader_enable) { return LAYOUT_TOK; } else { + /* 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->identifier = linear_strdup(mem_ctx, yytext); + yylval->identifier = (char *) linear_alloc_child(mem_ctx, yyleng + 1); + memcpy(yylval->identifier, yytext, yyleng + 1); return classify_identifier(yyextra, yytext); } } @@ -621,12 +636,17 @@ 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 + 1 > 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 + */ + yylval->identifier = (char *) linear_alloc_child(ctx, yyleng + 1); + memcpy(yylval->identifier, yytext, yyleng + 1); } return classify_identifier(state, yytext); } diff --git a/src/compiler/glsl/glsl_parser.yy b/src/compiler/glsl/glsl_parser.yy index 7b93d34fa3..d10b9a6a12 100644 --- a/src/compiler/glsl/glsl_parser.yy +++ b/src/compiler/glsl/glsl_parser.yy @@ -100,7 +100,7 @@ static bool match_layout_qualifier(const char *s1, const char *s2, int64_t n64; float real; double dreal; - const char *identifier; + char *identifier; struct ast_type_qualifier type_qualifier; @@ -2231,128 +2231,128 @@ type_specifier_nonarray: ; basic_type_specifier_nonarray: - VOID_TOK { $$ = "void"; } - | FLOAT_TOK { $$ = "float"; } - | DOUBLE_TOK { $$ = "double"; } - | INT_TOK { $$ = "int"; } - | UINT_TOK { $$ = "uint"; } - | BOOL_TOK { $$ = "bool"; } - | VEC2 { $$ = "vec2"; } - | VEC3 { $$ = "vec3"; } - | VEC4 { $$ = "vec4"; } - | BVEC2 { $$ = "bvec2"; } - | BVEC3 { $$ = "bvec3"; } - | BVEC4 { $$ = "bvec4"; } - | IVEC2 { $$ = "ivec2"; } - | IVEC3 { $$ = "ivec3"; } - | IVEC4 { $$ = "ivec4"; } - | UVEC2 { $$ = "uvec2"; } - | UVEC3 { $$ = "uvec3"; } - | UVEC4 { $$ = "uvec4"; } - | DVEC2 { $$ = "dvec2"; } - | DVEC3 { $$ = "dvec3"; } - | DVEC4 { $$ = "dvec4"; } - | MAT2X2 { $$ = "mat2"; } - | MAT2X3 { $$ = "mat2x3"; } - | MAT2X4 { $$ = "mat2x4"; } - | MAT3X2 { $$ = "mat3x2"; } - | MAT3X3 { $$ = "mat3"; } - | MAT3X4 { $$ = "mat3x4"; } - | MAT4X2 { $$ = "mat4x2"; } - | MAT4X3 { $$ = "mat4x3"; } - | MAT4X4 { $$ = "mat4"; } - | DMAT2X2 { $$ = "dmat2"; } - | DMAT2X3 { $$ = "dmat2x3"; } - | DMAT2X4 { $$ = "dmat2x4"; } - | DMAT3X2 { $$ = "dmat3x2"; } - | DMAT3X3 { $$ = "dmat3"; } - | DMAT3X4 { $$ = "dmat3x4"; } - | DMAT4X2 { $$ = "dmat4x2"; } - | DMAT4X3 { $$ = "dmat4x3"; } - | DMAT4X4 { $$ = "dmat4"; } - | SAMPLER1D { $$ = "sampler1D"; } - | SAMPLER2D { $$ = "sampler2D"; } - | SAMPLER2DRECT { $$ = "sampler2DRect"; } - | SAMPLER3D { $$ = "sampler3D"; } - | SAMPLERCUBE { $$ = "samplerCube"; } - | SAMPLEREXTERNALOES { $$ = "samplerExternalOES"; } - | SAMPLER1DSHADOW { $$ = "sampler1DShadow"; } - | SAMPLER2DSHADOW { $$ = "sampler2DShadow"; } - | SAMPLER2DRECTSHADOW { $$ = "sampler2DRectShadow"; } - | SAMPLERCUBESHADOW { $$ = "samplerCubeShadow"; } - | SAMPLER1DARRAY { $$ = "sampler1DArray"; } - | SAMPLER2DARRAY { $$ = "sampler2DArray"; } - | SAMPLER1DARRAYSHADOW { $$ = "sampler1DArrayShadow"; } - | SAMPLER2DARRAYSHADOW { $$ = "sampler2DArrayShadow"; } - | SAMPLERBUFFER { $$ = "samplerBuffer"; } - | SAMPLERCUBEARRAY { $$ = "samplerCubeArray"; } - | SAMPLERCUBEARRAYSHADOW { $$ = "samplerCubeArrayShadow"; } - | ISAMPLER1D { $$ = "isampler1D"; } - | ISAMPLER2D { $$ = "isampler2D"; } - | ISAMPLER2DRECT { $$ = "isampler2DRect"; } - | ISAMPLER3D { $$ = "isampler3D"; } - | ISAMPLERCUBE { $$ = "isamplerCube"; } - | ISAMPLER1DARRAY { $$ = "isampler1DArray"; } - | ISAMPLER2DARRAY { $$ = "isampler2DArray"; } - | ISAMPLERBUFFER { $$ = "isamplerBuffer"; } - | ISAMPLERCUBEARRAY { $$ = "isamplerCubeArray"; } - | USAMPLER1D { $$ = "usampler1D"; } - | USAMPLER2D { $$ = "usampler2D"; } - | USAMPLER2DRECT { $$ = "usampler2DRect"; } - | USAMPLER3D { $$ = "usampler3D"; } - | USAMPLERCUBE { $$ = "usamplerCube"; } - | USAMPLER1DARRAY { $$ = "usampler1DArray"; } - | USAMPLER2DARRAY { $$ = "usampler2DArray"; } - | USAMPLERBUFFER { $$ = "usamplerBuffer"; } - | USAMPLERCUBEARRAY { $$ = "usamplerCubeArray"; } - | SAMPLER2DMS { $$ = "sampler2DMS"; } - | ISAMPLER2DMS { $$ = "isampler2DMS"; } - | USAMPLER2DMS { $$ = "usampler2DMS"; } - | SAMPLER2DMSARRAY { $$ = "sampler2DMSArray"; } - | ISAMPLER2DMSARRAY { $$ = "isampler2DMSArray"; } - | USAMPLER2DMSARRAY { $$ = "usampler2DMSArray"; } - | IMAGE1D { $$ = "image1D"; } - | IMAGE2D { $$ = "image2D"; } - | IMAGE3D { $$ = "image3D"; } - | IMAGE2DRECT { $$ = "image2DRect"; } - | IMAGECUBE { $$ = "imageCube"; } - | IMAGEBUFFER { $$ = "imageBuffer"; } - | IMAGE1DARRAY { $$ = "image1DArray"; } - | IMAGE2DARRAY { $$ = "image2DArray"; } - | IMAGECUBEARRAY { $$ = "imageCubeArray"; } - | IMAGE2DMS { $$ = "image2DMS"; } - | IMAGE2DMSARRAY { $$ = "image2DMSArray"; } - | IIMAGE1D { $$ = "iimage1D"; } - | IIMAGE2D { $$ = "iimage2D"; } - | IIMAGE3D { $$ = "iimage3D"; } - | IIMAGE2DRECT { $$ = "iimage2DRect"; } - | IIMAGECUBE { $$ = "iimageCube"; } - | IIMAGEBUFFER { $$ = "iimageBuffer"; } - | IIMAGE1DARRAY { $$ = "iimage1DArray"; } - | IIMAGE2DARRAY { $$ = "iimage2DArray"; } - | IIMAGECUBEARRAY { $$ = "iimageCubeArray"; } - | IIMAGE2DMS { $$ = "iimage2DMS"; } - | IIMAGE2DMSARRAY { $$ = "iimage2DMSArray"; } - | UIMAGE1D { $$ = "uimage1D"; } - | UIMAGE2D { $$ = "uimage2D"; } - | UIMAGE3D { $$ = "uimage3D"; } - | UIMAGE2DRECT { $$ = "uimage2DRect"; } - | UIMAGECUBE { $$ = "uimageCube"; } - | UIMAGEBUFFER { $$ = "uimageBuffer"; } - | UIMAGE1DARRAY { $$ = "uimage1DArray"; } - | UIMAGE2DARRAY { $$ = "uimage2DArray"; } - | UIMAGECUBEARRAY { $$ = "uimageCubeArray"; } - | UIMAGE2DMS { $$ = "uimage2DMS"; } - | UIMAGE2DMSARRAY { $$ = "uimage2DMSArray"; } - | ATOMIC_UINT { $$ = "atomic_uint"; } - | INT64_TOK { $$ = "int64_t"; } - | I64VEC2 { $$ = "i64vec2"; } - | I64VEC3 { $$ = "i64vec3"; } - | I64VEC4 { $$ = "i64vec4"; } - | UINT64_TOK { $$ = "uint64_t"; } - | U64VEC2 { $$ = "u64vec2"; } - | U64VEC3 { $$ = "u64vec3"; } - | U64VEC4 { $$ = "u64vec4"; } + VOID_TOK { $$ = (char *) "void"; } + | FLOAT_TOK { $$ = (char *) "float"; } + | DOUBLE_TOK { $$ = (char *) "double"; } + | INT_TOK { $$ = (char *) "int"; } + | UINT_TOK { $$ = (char *) "uint"; } + | BOOL_TOK { $$ = (char *) "bool"; } + | VEC2 { $$ = (char *) "vec2"; } + | VEC3 { $$ = (char *) "vec3"; } + | VEC4 { $$ = (char *) "vec4"; } + | BVEC2 { $$ = (char *) "bvec2"; } + | BVEC3 { $$ = (char *) "bvec3"; } + | BVEC4 { $$ = (char *) "bvec4"; } + | IVEC2 { $$ = (char *) "ivec2"; } + | IVEC3 { $$ = (char *) "ivec3"; } + | IVEC4 { $$ = (char *) "ivec4"; } + | UVEC2 { $$ = (char *) "uvec2"; } + | UVEC3 { $$ = (char *) "uvec3"; } + | UVEC4 { $$ = (char *) "uvec4"; } + | DVEC2 { $$ = (char *) "dvec2"; } + | DVEC3 { $$ = (char *) "dvec3"; } + | DVEC4 { $$ = (char *) "dvec4"; } + | MAT2X2 { $$ = (char *) "mat2"; } + | MAT2X3 { $$ = (char *) "mat2x3"; } + | MAT2X4 { $$ = (char *) "mat2x4"; } + | MAT3X2 { $$ = (char *) "mat3x2"; } + | MAT3X3 { $$ = (char *) "mat3"; } + | MAT3X4 { $$ = (char *) "mat3x4"; } + | MAT4X2 { $$ = (char *) "mat4x2"; } + | MAT4X3 { $$ = (char *) "mat4x3"; } + | MAT4X4 { $$ = (char *) "mat4"; } + | DMAT2X2 { $$ = (char *) "dmat2"; } + | DMAT2X3 { $$ = (char *) "dmat2x3"; } + | DMAT2X4 { $$ = (char *) "dmat2x4"; } + | DMAT3X2 { $$ = (char *) "dmat3x2"; } + | DMAT3X3 { $$ = (char *) "dmat3"; } + | DMAT3X4 { $$ = (char *) "dmat3x4"; } + | DMAT4X2 { $$ = (char *) "dmat4x2"; } + | DMAT4X3 { $$ = (char *) "dmat4x3"; } + | DMAT4X4 { $$ = (char *) "dmat4"; } + | SAMPLER1D { $$ = (char *) "sampler1D"; } + | SAMPLER2D { $$ = (char *) "sampler2D"; } + | SAMPLER2DRECT { $$ = (char *) "sampler2DRect"; } + | SAMPLER3D { $$ = (char *) "sampler3D"; } + | SAMPLERCUBE { $$ = (char *) "samplerCube"; } + | SAMPLEREXTERNALOES { $$ = (char *) "samplerExternalOES"; } + | SAMPLER1DSHADOW { $$ = (char *) "sampler1DShadow"; } + | SAMPLER2DSHADOW { $$ = (char *) "sampler2DShadow"; } + | SAMPLER2DRECTSHADOW { $$ = (char *) "sampler2DRectShadow"; } + | SAMPLERCUBESHADOW { $$ = (char *) "samplerCubeShadow"; } + | SAMPLER1DARRAY { $$ = (char *) "sampler1DArray"; } + | SAMPLER2DARRAY { $$ = (char *) "sampler2DArray"; } + | SAMPLER1DARRAYSHADOW { $$ = (char *) "sampler1DArrayShadow"; } + | SAMPLER2DARRAYSHADOW { $$ = (char *) "sampler2DArrayShadow"; } + | SAMPLERBUFFER { $$ = (char *) "samplerBuffer"; } + | SAMPLERCUBEARRAY { $$ = (char *) "samplerCubeArray"; } + | SAMPLERCUBEARRAYSHADOW { $$ = (char *) "samplerCubeArrayShadow"; } + | ISAMPLER1D { $$ = (char *) "isampler1D"; } + | ISAMPLER2D { $$ = (char *) "isampler2D"; } + | ISAMPLER2DRECT { $$ = (char *) "isampler2DRect"; } + | ISAMPLER3D { $$ = (char *) "isampler3D"; } + | ISAMPLERCUBE { $$ = (char *) "isamplerCube"; } + | ISAMPLER1DARRAY { $$ = (char *) "isampler1DArray"; } + | ISAMPLER2DARRAY { $$ = (char *) "isampler2DArray"; } + | ISAMPLERBUFFER { $$ = (char *) "isamplerBuffer"; } + | ISAMPLERCUBEARRAY { $$ = (char *) "isamplerCubeArray"; } + | USAMPLER1D { $$ = (char *) "usampler1D"; } + | USAMPLER2D { $$ = (char *) "usampler2D"; } + | USAMPLER2DRECT { $$ = (char *) "usampler2DRect"; } + | USAMPLER3D { $$ = (char *) "usampler3D"; } + | USAMPLERCUBE { $$ = (char *) "usamplerCube"; } + | USAMPLER1DARRAY { $$ = (char *) "usampler1DArray"; } + | USAMPLER2DARRAY { $$ = (char *) "usampler2DArray"; } + | USAMPLERBUFFER { $$ = (char *) "usamplerBuffer"; } + | USAMPLERCUBEARRAY { $$ = (char *) "usamplerCubeArray"; } + | SAMPLER2DMS { $$ = (char *) "sampler2DMS"; } + | ISAMPLER2DMS { $$ = (char *) "isampler2DMS"; } + | USAMPLER2DMS { $$ = (char *) "usampler2DMS"; } + | SAMPLER2DMSARRAY { $$ = (char *) "sampler2DMSArray"; } + | ISAMPLER2DMSARRAY { $$ = (char *) "isampler2DMSArray"; } + | USAMPLER2DMSARRAY { $$ = (char *) "usampler2DMSArray"; } + | IMAGE1D { $$ = (char *) "image1D"; } + | IMAGE2D { $$ = (char *) "image2D"; } + | IMAGE3D { $$ = (char *) "image3D"; } + | IMAGE2DRECT { $$ = (char *) "image2DRect"; } + | IMAGECUBE { $$ = (char *) "imageCube"; } + | IMAGEBUFFER { $$ = (char *) "imageBuffer"; } + | IMAGE1DARRAY { $$ = (char *) "image1DArray"; } + | IMAGE2DARRAY { $$ = (char *) "image2DArray"; } + | IMAGECUBEARRAY { $$ = (char *) "imageCubeArray"; } + | IMAGE2DMS { $$ = (char *) "image2DMS"; } + | IMAGE2DMSARRAY { $$ = (char *) "image2DMSArray"; } + | IIMAGE1D { $$ = (char *) "iimage1D"; } + | IIMAGE2D { $$ = (char *) "iimage2D"; } + | IIMAGE3D { $$ = (char *) "iimage3D"; } + | IIMAGE2DRECT { $$ = (char *) "iimage2DRect"; } + | IIMAGECUBE { $$ = (char *) "iimageCube"; } + | IIMAGEBUFFER { $$ = (char *) "iimageBuffer"; } + | IIMAGE1DARRAY { $$ = (char *) "iimage1DArray"; } + | IIMAGE2DARRAY { $$ = (char *) "iimage2DArray"; } + | IIMAGECUBEARRAY { $$ = (char *) "iimageCubeArray"; } + | IIMAGE2DMS { $$ = (char *) "iimage2DMS"; } + | IIMAGE2DMSARRAY { $$ = (char *) "iimage2DMSArray"; } + | UIMAGE1D { $$ = (char *) "uimage1D"; } + | UIMAGE2D { $$ = (char *) "uimage2D"; } + | UIMAGE3D { $$ = (char *) "uimage3D"; } + | UIMAGE2DRECT { $$ = (char *) "uimage2DRect"; } + | UIMAGECUBE { $$ = (char *) "uimageCube"; } + | UIMAGEBUFFER { $$ = (char *) "uimageBuffer"; } + | UIMAGE1DARRAY { $$ = (char *) "uimage1DArray"; } + | UIMAGE2DARRAY { $$ = (char *) "uimage2DArray"; } + | UIMAGECUBEARRAY { $$ = (char *) "uimageCubeArray"; } + | UIMAGE2DMS { $$ = (char *) "uimage2DMS"; } + | UIMAGE2DMSARRAY { $$ = (char *) "uimage2DMSArray"; } + | ATOMIC_UINT { $$ = (char *) "atomic_uint"; } + | INT64_TOK { $$ = (char *) "int64_t"; } + | I64VEC2 { $$ = (char *) "i64vec2"; } + | I64VEC3 { $$ = (char *) "i64vec3"; } + | I64VEC4 { $$ = (char *) "i64vec4"; } + | UINT64_TOK { $$ = (char *) "uint64_t"; } + | U64VEC2 { $$ = (char *) "u64vec2"; } + | U64VEC3 { $$ = (char *) "u64vec3"; } + | U64VEC4 { $$ = (char *) "u64vec4"; } ; precision_qualifier: -- 2.13.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev