diff options
author | Matt Turner <[email protected]> | 2013-06-25 00:27:41 -0700 |
---|---|---|
committer | Matt Turner <[email protected]> | 2013-07-11 20:58:59 -0700 |
commit | 5df807b06f20d53063af9cfc5b4fc867f5fb810a (patch) | |
tree | e8c2430f713720db16831690e0b1ba5cbb927aec | |
parent | e641b5fbeeff6b8391de4c854c6456eac691b1b5 (diff) |
glsl: Track structs' ast_type_specifiers in symbol table.
Will be used in a future commit. An ast_type_specifier is stored (rather
than an ast_struct_specifier) with the idea that we may have more
general uses for this in the future. struct names are prefixed with
'#ast.' to avoid collisions with the glsl_types in the symbol table.
Reviewed-by: Ian Romanick <[email protected]>
-rw-r--r-- | src/glsl/glsl_symbol_table.cpp | 29 | ||||
-rw-r--r-- | src/glsl/glsl_symbol_table.h | 2 |
2 files changed, 27 insertions, 4 deletions
diff --git a/src/glsl/glsl_symbol_table.cpp b/src/glsl/glsl_symbol_table.cpp index 50bf11302b3..0bea5364ef5 100644 --- a/src/glsl/glsl_symbol_table.cpp +++ b/src/glsl/glsl_symbol_table.cpp @@ -84,17 +84,19 @@ public: } symbol_table_entry(ir_variable *v) : - v(v), f(0), t(0), ibu(0), ibi(0), ibo(0) {} + v(v), f(0), t(0), ibu(0), ibi(0), ibo(0), a(0) {} symbol_table_entry(ir_function *f) : - v(0), f(f), t(0), ibu(0), ibi(0), ibo(0) {} + v(0), f(f), t(0), ibu(0), ibi(0), ibo(0), a(0) {} symbol_table_entry(const glsl_type *t) : - v(0), f(0), t(t), ibu(0), ibi(0), ibo(0) {} + v(0), f(0), t(t), ibu(0), ibi(0), ibo(0), a(0) {} symbol_table_entry(const glsl_type *t, enum ir_variable_mode mode) : - v(0), f(0), t(0), ibu(0), ibi(0), ibo(0) + v(0), f(0), t(0), ibu(0), ibi(0), ibo(0), a(0) { assert(t->is_interface()); add_interface(t, mode); } + symbol_table_entry(const class ast_type_specifier *a): + v(0), f(0), t(0), ibu(0), ibi(0), ibo(0), a(a) {} ir_variable *v; ir_function *f; @@ -102,6 +104,7 @@ public: const glsl_type *ibu; const glsl_type *ibi; const glsl_type *ibo; + const class ast_type_specifier *a; }; glsl_symbol_table::glsl_symbol_table() @@ -172,6 +175,15 @@ bool glsl_symbol_table::add_type(const char *name, const glsl_type *t) return _mesa_symbol_table_add_symbol(table, -1, name, entry) == 0; } +bool glsl_symbol_table::add_type_ast(const char *name, const class ast_type_specifier *a) +{ + symbol_table_entry *entry = new(mem_ctx) symbol_table_entry(a); + char ast_name[strlen("#ast.") + strlen(name) + 1]; + strcpy(ast_name, "#ast."); + strcat(ast_name + strlen("#ast."), name); + return _mesa_symbol_table_add_symbol(table, -1, ast_name, entry) == 0; +} + bool glsl_symbol_table::add_interface(const char *name, const glsl_type *i, enum ir_variable_mode mode) { @@ -223,6 +235,15 @@ const glsl_type *glsl_symbol_table::get_type(const char *name) return entry != NULL ? entry->t : NULL; } +const class ast_type_specifier *glsl_symbol_table::get_type_ast(const char *name) +{ + char ast_name[strlen("#ast.") + strlen(name) + 1]; + strcpy(ast_name, "#ast."); + strcat(ast_name + strlen("#ast."), name); + symbol_table_entry *entry = get_entry(ast_name); + return entry != NULL ? entry->a : NULL; +} + const glsl_type *glsl_symbol_table::get_interface(const char *name, enum ir_variable_mode mode) { diff --git a/src/glsl/glsl_symbol_table.h b/src/glsl/glsl_symbol_table.h index 2753bdf3156..62d26b89ac4 100644 --- a/src/glsl/glsl_symbol_table.h +++ b/src/glsl/glsl_symbol_table.h @@ -98,6 +98,7 @@ public: /*@{*/ bool add_variable(ir_variable *v); bool add_type(const char *name, const glsl_type *t); + bool add_type_ast(const char *name, const class ast_type_specifier *t); bool add_function(ir_function *f); bool add_interface(const char *name, const glsl_type *i, enum ir_variable_mode mode); @@ -114,6 +115,7 @@ public: /*@{*/ ir_variable *get_variable(const char *name); const glsl_type *get_type(const char *name); + const class ast_type_specifier *get_type_ast(const char *name); ir_function *get_function(const char *name); const glsl_type *get_interface(const char *name, enum ir_variable_mode mode); |