X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fglsl%2Fglsl_symbol_table.cpp;h=9ae5fd3e552e4cf88f39fbb7ee242e5f66a1dd95;hb=d1992255bb29054fa51763376d125183a9f602f3;hp=6c682acf5604ecc441dd7af1a453fdd9e1be863f;hpb=741744f691d6ef63e9f9a4c03136f969f2ffb0bf;p=mesa.git diff --git a/src/compiler/glsl/glsl_symbol_table.cpp b/src/compiler/glsl/glsl_symbol_table.cpp index 6c682acf560..9ae5fd3e552 100644 --- a/src/compiler/glsl/glsl_symbol_table.cpp +++ b/src/compiler/glsl/glsl_symbol_table.cpp @@ -27,7 +27,7 @@ class symbol_table_entry { public: - DECLARE_RALLOC_CXX_OPERATORS(symbol_table_entry); + DECLARE_LINEAR_ALLOC_CXX_OPERATORS(symbol_table_entry); bool add_interface(const glsl_type *i, enum ir_variable_mode mode) { @@ -106,6 +106,7 @@ glsl_symbol_table::glsl_symbol_table() this->separate_function_namespace = false; this->table = _mesa_symbol_table_ctor(); this->mem_ctx = ralloc_context(NULL); + this->linalloc = linear_alloc_parent(this->mem_ctx, 0); } glsl_symbol_table::~glsl_symbol_table() @@ -126,7 +127,7 @@ void glsl_symbol_table::pop_scope() bool glsl_symbol_table::name_declared_this_scope(const char *name) { - return _mesa_symbol_table_symbol_scope(table, -1, name) == 0; + return _mesa_symbol_table_symbol_scope(table, name) == 0; } bool glsl_symbol_table::add_variable(ir_variable *v) @@ -149,10 +150,10 @@ bool glsl_symbol_table::add_variable(ir_variable *v) * entry includes a function, propagate that to this block - otherwise * the new variable declaration would shadow the function. */ - symbol_table_entry *entry = new(mem_ctx) symbol_table_entry(v); + symbol_table_entry *entry = new(linalloc) symbol_table_entry(v); if (existing != NULL) entry->f = existing->f; - int added = _mesa_symbol_table_add_symbol(table, -1, v->name, entry); + int added = _mesa_symbol_table_add_symbol(table, v->name, entry); assert(added == 0); (void)added; return true; @@ -161,14 +162,14 @@ bool glsl_symbol_table::add_variable(ir_variable *v) } /* 1.20+ rules: */ - symbol_table_entry *entry = new(mem_ctx) symbol_table_entry(v); - return _mesa_symbol_table_add_symbol(table, -1, v->name, entry) == 0; + symbol_table_entry *entry = new(linalloc) symbol_table_entry(v); + return _mesa_symbol_table_add_symbol(table, v->name, entry) == 0; } bool glsl_symbol_table::add_type(const char *name, const glsl_type *t) { - symbol_table_entry *entry = new(mem_ctx) symbol_table_entry(t); - return _mesa_symbol_table_add_symbol(table, -1, name, entry) == 0; + symbol_table_entry *entry = new(linalloc) symbol_table_entry(t); + return _mesa_symbol_table_add_symbol(table, name, entry) == 0; } bool glsl_symbol_table::add_interface(const char *name, const glsl_type *i, @@ -178,9 +179,9 @@ bool glsl_symbol_table::add_interface(const char *name, const glsl_type *i, symbol_table_entry *entry = get_entry(name); if (entry == NULL) { symbol_table_entry *entry = - new(mem_ctx) symbol_table_entry(i, mode); + new(linalloc) symbol_table_entry(i, mode); bool add_interface_symbol_result = - _mesa_symbol_table_add_symbol(table, -1, name, entry) == 0; + _mesa_symbol_table_add_symbol(table, name, entry) == 0; assert(add_interface_symbol_result); return add_interface_symbol_result; } else { @@ -198,8 +199,8 @@ bool glsl_symbol_table::add_function(ir_function *f) return true; } } - symbol_table_entry *entry = new(mem_ctx) symbol_table_entry(f); - return _mesa_symbol_table_add_symbol(table, -1, f->name, entry) == 0; + symbol_table_entry *entry = new(linalloc) symbol_table_entry(f); + return _mesa_symbol_table_add_symbol(table, f->name, entry) == 0; } bool glsl_symbol_table::add_default_precision_qualifier(const char *type_name, @@ -207,19 +208,22 @@ bool glsl_symbol_table::add_default_precision_qualifier(const char *type_name, { char *name = ralloc_asprintf(mem_ctx, "#default_precision_%s", type_name); - ast_type_specifier *default_specifier = new(mem_ctx) ast_type_specifier(name); + ast_type_specifier *default_specifier = new(linalloc) ast_type_specifier(name); default_specifier->default_precision = precision; symbol_table_entry *entry = - new(mem_ctx) symbol_table_entry(default_specifier); + new(linalloc) symbol_table_entry(default_specifier); - return _mesa_symbol_table_add_symbol(table, -1, name, entry) == 0; + if (!get_entry(name)) + return _mesa_symbol_table_add_symbol(table, name, entry) == 0; + + return _mesa_symbol_table_replace_symbol(table, name, entry) == 0; } void glsl_symbol_table::add_global_function(ir_function *f) { - symbol_table_entry *entry = new(mem_ctx) symbol_table_entry(f); - int added = _mesa_symbol_table_add_global_symbol(table, -1, f->name, entry); + symbol_table_entry *entry = new(linalloc) symbol_table_entry(f); + int added = _mesa_symbol_table_add_global_symbol(table, f->name, entry); assert(added == 0); (void)added; } @@ -261,7 +265,7 @@ int glsl_symbol_table::get_default_precision_qualifier(const char *type_name) symbol_table_entry *glsl_symbol_table::get_entry(const char *name) { return (symbol_table_entry *) - _mesa_symbol_table_find_symbol(table, -1, name); + _mesa_symbol_table_find_symbol(table, name); } void @@ -278,3 +282,13 @@ glsl_symbol_table::disable_variable(const char *name) entry->v = NULL; } } + +void +glsl_symbol_table::replace_variable(const char *name, + ir_variable *v) +{ + symbol_table_entry *entry = get_entry(name); + if (entry != NULL) { + entry->v = v; + } +}