[Mesa-dev] [PATCH 08/15] glsl/lexer: use the linear allocator

Marek Olšák maraeo at gmail.com
Sat Oct 8 10:58:32 UTC 2016


From: Marek Olšák <marek.olsak at amd.com>

---
 src/compiler/glsl/glsl_lexer.ll          | 16 ++++++++--------
 src/compiler/glsl/glsl_parser_extras.cpp |  2 ++
 src/compiler/glsl/glsl_parser_extras.h   |  2 ++
 3 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/src/compiler/glsl/glsl_lexer.ll b/src/compiler/glsl/glsl_lexer.ll
index d5e5d4c..b473af7 100644
--- a/src/compiler/glsl/glsl_lexer.ll
+++ b/src/compiler/glsl/glsl_lexer.ll
@@ -73,22 +73,22 @@ static int classify_identifier(struct _mesa_glsl_parse_state *, const char *);
    do {									\
       if (yyextra->is_version(allowed_glsl, allowed_glsl_es)		\
           || (alt_expr)) {						\
 	 return token;							\
       } else if (yyextra->is_version(reserved_glsl,			\
                                      reserved_glsl_es)) {		\
 	 _mesa_glsl_error(yylloc, yyextra,				\
 			  "illegal use of reserved word `%s'", yytext);	\
 	 return ERROR_TOK;						\
       } else {								\
-	 void *mem_ctx = yyextra;					\
-	 yylval->identifier = ralloc_strdup(mem_ctx, yytext);		\
+	 void *mem_ctx = yyextra->linalloc;					\
+	 yylval->identifier = linear_strdup(mem_ctx, yytext);		\
 	 return classify_identifier(yyextra, yytext);			\
       }									\
    } while (0)
 
 /**
  * A macro for handling keywords that have been present in GLSL since
  * its origin, but were changed into reserved words in GLSL 3.00 ES.
  */
 #define DEPRECATED_ES_KEYWORD(token)					\
    do {									\
@@ -238,22 +238,22 @@ HASH		^{SPC}#{SPC}
 				}
 ^{SPC}#{SPC}pragma{SPCP}	{ BEGIN PRAGMA; }
 
 <PRAGMA>\n			{ BEGIN 0; yylineno++; yycolumn = 0; }
 <PRAGMA>.			{ }
 
 <PP>\/\/[^\n]*			{ }
 <PP>[ \t\r]*			{ }
 <PP>:				return COLON;
 <PP>[_a-zA-Z][_a-zA-Z0-9]*	{
-				   void *mem_ctx = yyextra;
-				   yylval->identifier = ralloc_strdup(mem_ctx, yytext);
+				   void *mem_ctx = yyextra->linalloc;
+				   yylval->identifier = linear_strdup(mem_ctx, yytext);
 				   return IDENTIFIER;
 				}
 <PP>[1-9][0-9]*			{
 				    yylval->n = strtol(yytext, NULL, 10);
 				    return INTCONSTANT;
 				}
 <PP>\n				{ BEGIN 0; yylineno++; yycolumn = 0; return EOL; }
 <PP>.				{ return yytext[0]; }
 
 \n		{ yylineno++; yycolumn = 0; }
@@ -422,22 +422,22 @@ layout		{
 		      || yyextra->ARB_explicit_attrib_location_enable
 		      || yyextra->ARB_explicit_uniform_location_enable
                       || yyextra->has_separate_shader_objects()
 		      || yyextra->ARB_uniform_buffer_object_enable
 		      || yyextra->ARB_fragment_coord_conventions_enable
                       || yyextra->ARB_shading_language_420pack_enable
                       || yyextra->ARB_compute_shader_enable
                       || yyextra->ARB_tessellation_shader_enable) {
 		      return LAYOUT_TOK;
 		   } else {
-		      void *mem_ctx = yyextra;
-		      yylval->identifier = ralloc_strdup(mem_ctx, yytext);
+		      void *mem_ctx = yyextra->linalloc;
+		      yylval->identifier = linear_strdup(mem_ctx, yytext);
 		      return classify_identifier(yyextra, yytext);
 		   }
 		}
 
 \+\+		return INC_OP;
 --		return DEC_OP;
 \<=		return LE_OP;
 >=		return GE_OP;
 ==		return EQ_OP;
 !=		return NE_OP;
@@ -583,27 +583,27 @@ isamplerBuffer	KEYWORD_WITH_ALT(140, 300, 140, 320, yyextra->EXT_texture_buffer_
 usamplerBuffer	KEYWORD_WITH_ALT(140, 300, 140, 320, yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable, USAMPLERBUFFER);
 
     /* Additional reserved words in GLSL ES 3.00 */
 resource	KEYWORD(420, 300, 0, 0, RESOURCE);
 sample		KEYWORD_WITH_ALT(400, 300, 400, 320, yyextra->ARB_gpu_shader5_enable || yyextra->OES_shader_multisample_interpolation_enable, SAMPLE);
 subroutine	KEYWORD_WITH_ALT(400, 300, 400, 0, yyextra->ARB_shader_subroutine_enable, SUBROUTINE);
 
 
 [_a-zA-Z][_a-zA-Z0-9]*	{
 			    struct _mesa_glsl_parse_state *state = yyextra;
-			    void *ctx = state;	
+			    void *ctx = state->linalloc;
 			    if (state->es_shader && strlen(yytext) > 1024) {
 			       _mesa_glsl_error(yylloc, state,
 			                        "Identifier `%s' exceeds 1024 characters",
 			                        yytext);
 			    } else {
-			      yylval->identifier = ralloc_strdup(ctx, yytext);
+			      yylval->identifier = linear_strdup(ctx, yytext);
 			    }
 			    return classify_identifier(state, yytext);
 			}
 
 \.			{ struct _mesa_glsl_parse_state *state = yyextra;
 			  state->is_field = true;
 			  return DOT_TOK; }
 
 .			{ return yytext[0]; }
 
diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp
index 5f3474e..d649695 100644
--- a/src/compiler/glsl/glsl_parser_extras.cpp
+++ b/src/compiler/glsl/glsl_parser_extras.cpp
@@ -60,20 +60,22 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
    : ctx(_ctx), cs_input_local_size_specified(false), cs_input_local_size(),
      switch_state()
 {
    assert(stage < MESA_SHADER_STAGES);
    this->stage = stage;
 
    this->scanner = NULL;
    this->translation_unit.make_empty();
    this->symbols = new(mem_ctx) glsl_symbol_table;
 
+   this->linalloc = linear_alloc_parent(this, 0);
+
    this->info_log = ralloc_strdup(mem_ctx, "");
    this->error = false;
    this->loop_nesting_ast = NULL;
 
    this->uses_builtin_functions = false;
 
    /* Set default language version and extensions */
    this->language_version = 110;
    this->forced_language_version = ctx->Const.ForceGLSLVersion;
    this->zero_init = ctx->Const.GLSLZeroInit;
diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h
index c0a5704..cd9fa59 100644
--- a/src/compiler/glsl/glsl_parser_extras.h
+++ b/src/compiler/glsl/glsl_parser_extras.h
@@ -326,20 +326,22 @@ struct _mesa_glsl_parse_state {
    }
 
    void process_version_directive(YYLTYPE *locp, int version,
                                   const char *ident);
 
    struct gl_context *const ctx;
    void *scanner;
    exec_list translation_unit;
    glsl_symbol_table *symbols;
 
+   void *linalloc;
+
    unsigned num_supported_versions;
    struct {
       unsigned ver;
       uint8_t gl_ver;
       bool es;
    } supported_versions[16];
 
    bool es_shader;
    unsigned language_version;
    unsigned forced_language_version;
-- 
2.7.4



More information about the mesa-dev mailing list