glsl/parser: Track built-in types using the glsl_type directly
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 20 Sep 2017 21:19:15 +0000 (16:19 -0500)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 30 Oct 2017 16:27:09 +0000 (09:27 -0700)
Without the lexer changes, tests/glslparsertest/glsl2/tex_rect-02.frag
fails.  Before this change, the parser would determine that
sampler2DRect is not a valid type because the call to
state->symbols->get_type() in ast_type_specifier::glsl_type() would
return NULL.  Since ast_type_specifier::glsl_type() is now going to
return the glsl_type pointer that it received from the lexer, it doesn't
have an opportunity to generate an error.

   text    data     bss     dec     hex filename
8255243  268856  294072 8818171  868dfb 32-bit i965_dri.so before
8255291  268856  294072 8818219  868e2b 32-bit i965_dri.so after
7815195  345592  420592 8581379  82f103 64-bit i965_dri.so before
7815339  345592  420592 8581523  82f193 64-bit i965_dri.so after

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/compiler/glsl/ast.h
src/compiler/glsl/ast_to_hir.cpp
src/compiler/glsl/glsl_lexer.ll
src/compiler/glsl/glsl_parser.yy

index 1be86ac17d98a381c43695f187e3a27493c4b777..eee224828129fb9798ca2a0f8891f0a06bb5244d 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "list.h"
 #include "glsl_parser_extras.h"
+#include "compiler/glsl_types.h"
 
 struct _mesa_glsl_parse_state;
 
@@ -853,7 +854,7 @@ class ast_type_specifier : public ast_node {
 public:
    /** Construct a type specifier from a type name */
    ast_type_specifier(const char *name) 
-      : type_name(name), structure(NULL), array_specifier(NULL),
+      : type(NULL), type_name(name), structure(NULL), array_specifier(NULL),
        default_precision(ast_precision_none)
    {
       /* empty */
@@ -861,12 +862,19 @@ public:
 
    /** Construct a type specifier from a structure definition */
    ast_type_specifier(ast_struct_specifier *s)
-      : type_name(s->name), structure(s), array_specifier(NULL),
+      : type(NULL), type_name(s->name), structure(s), array_specifier(NULL),
        default_precision(ast_precision_none)
    {
       /* empty */
    }
 
+   ast_type_specifier(const glsl_type *t)
+      : type(t), type_name(t->name), structure(NULL), array_specifier(NULL),
+        default_precision(ast_precision_none)
+   {
+      /* empty */
+   }
+
    const struct glsl_type *glsl_type(const char **name,
                                     struct _mesa_glsl_parse_state *state)
       const;
@@ -875,6 +883,7 @@ public:
 
    ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
 
+   const struct glsl_type *type;
    const char *type_name;
    ast_struct_specifier *structure;
 
index d7c8b47f9d476bfe288f483a92f26a40436031a8..6090ee9257365fbc38d52ce45c13bfe7fb72f22f 100644 (file)
@@ -2361,7 +2361,9 @@ ast_type_specifier::glsl_type(const char **name,
 {
    const struct glsl_type *type;
 
-   if (structure)
+   if (this->type != NULL)
+      type = this->type;
+   else if (structure)
       type = structure->type;
    else
       type = state->symbols->get_type(this->type_name);
index 5dad6eeb042d6b6811a60006e890098bc72d6c02..d2278ba01d6f15efd61406f6d49ed2d5fb3f6495 100644 (file)
@@ -132,18 +132,23 @@ static int classify_identifier(struct _mesa_glsl_parse_state *, const char *,
 /**
  * Like DEPRECATED_ES_KEYWORD, but for types
  */
-#define DEPRECATED_ES_TYPE(gtype)                                      \
+#define DEPRECATED_ES_TYPE_WITH_ALT(alt_expr, gtype)                   \
    do {                                                                        \
       if (yyextra->is_version(0, 300)) {                               \
-        _mesa_glsl_error(yylloc, yyextra,                              \
-                         "illegal use of reserved word `%s'", yytext); \
-        return ERROR_TOK;                                              \
-      } else {                                                         \
-        yylval->type = gtype;                                          \
+         _mesa_glsl_error(yylloc, yyextra,                             \
+                          "illegal use of reserved word `%s'", yytext);        \
+         return ERROR_TOK;                                             \
+      } else if (alt_expr) {                                           \
+         yylval->type = gtype;                                         \
          return BASIC_TYPE_TOK;                                                \
+      } else {                                                         \
+         return classify_identifier(yyextra, yytext, yyleng, yylval);  \
       }                                                                        \
    } while (0)
 
+#define DEPRECATED_ES_TYPE(gtype)                                      \
+   DEPRECATED_ES_TYPE_WITH_ALT(true, gtype)
+
 static int
 literal_integer(char *text, int len, struct _mesa_glsl_parse_state *state,
                YYSTYPE *lval, YYLTYPE *lloc, int base)
@@ -619,9 +624,9 @@ dmat4x4             TYPE_WITH_ALT(110, 100, 400, 0, yyextra->ARB_gpu_shader_fp64_enable, gl
 fvec2          KEYWORD(110, 100, 0, 0, FVEC2);
 fvec3          KEYWORD(110, 100, 0, 0, FVEC3);
 fvec4          KEYWORD(110, 100, 0, 0, FVEC4);
-sampler2DRect          DEPRECATED_ES_TYPE(glsl_type::sampler2DRect_type);
+sampler2DRect          DEPRECATED_ES_TYPE_WITH_ALT(yyextra->ARB_texture_rectangle_enable, glsl_type::sampler2DRect_type);
 sampler3DRect          KEYWORD(110, 100, 0, 0, SAMPLER3DRECT);
-sampler2DRectShadow    DEPRECATED_ES_TYPE(glsl_type::sampler2DRectShadow_type);
+sampler2DRectShadow    DEPRECATED_ES_TYPE_WITH_ALT(yyextra->ARB_texture_rectangle_enable, glsl_type::sampler2DRectShadow_type);
 sizeof         KEYWORD(110, 100, 0, 0, SIZEOF);
 cast           KEYWORD(110, 100, 0, 0, CAST);
 namespace      KEYWORD(110, 100, 0, 0, NAMESPACE);
index 0a5342571c6dce71cc8626089b6ef53079c58431..19147c7a3ec9db047adcd3dbd784fdfc189b284e 100644 (file)
@@ -2189,7 +2189,7 @@ type_specifier_nonarray:
    basic_type_specifier_nonarray
    {
       void *ctx = state->linalloc;
-      $$ = new(ctx) ast_type_specifier($1->name);
+      $$ = new(ctx) ast_type_specifier($1);
       $$->set_location(@1);
    }
    | struct_specifier