1770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/* 2770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Copyright © 2008 Intel Corporation 3770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 4770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a 5770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * copy of this software and associated documentation files (the "Software"), 6770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * to deal in the Software without restriction, including without limitation 7770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * and/or sell copies of the Software, and to permit persons to whom the 9770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Software is furnished to do so, subject to the following conditions: 10770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 11770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * The above copyright notice and this permission notice (including the next 12770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * paragraph) shall be included in all copies or substantial portions of the 13770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Software. 14770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 15770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * DEALINGS IN THE SOFTWARE. 22770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 23770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 245e3b2baae74e6cde494b2fe5c6b32e3e8ef0ce87Brian Paul#include "main/imports.h" 25770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "symbol_table.h" 26770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "hash_table.h" 27770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 28770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct symbol { 29770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /** 30770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Link to the next symbol in the table with the same name 31770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 32770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * The linked list of symbols with the same name is ordered by scope 33770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * from inner-most to outer-most. 34770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 35770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct symbol *next_with_same_name; 36770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 37770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 38770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /** 39770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Link to the next symbol in the table with the same scope 40770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 41770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * The linked list of symbols with the same scope is unordered. Symbols 42770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * in this list my have unique names. 43770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 44770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct symbol *next_with_same_scope; 45770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 46770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 47770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /** 48770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Header information for the list of symbols with the same name. 49770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 50770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct symbol_header *hdr; 51770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 52770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 53770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /** 54770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Name space of the symbol 55770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 56770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Name space are arbitrary user assigned integers. No two symbols can 57770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * exist in the same name space at the same scope level. 58770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 59770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int name_space; 60770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 6184341f4b2014810b2964230384fe76338be1d78eIan Romanick /** Scope depth where this symbol was defined. */ 6284341f4b2014810b2964230384fe76338be1d78eIan Romanick unsigned depth; 6384341f4b2014810b2964230384fe76338be1d78eIan Romanick 64770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /** 65770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Arbitrary user supplied data. 66770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 67770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick void *data; 68770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}; 69770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 70770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 71770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/** 72770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 73770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct symbol_header { 740f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick /** Linkage in list of all headers in a given symbol table. */ 750f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick struct symbol_header *next; 760f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick 77770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /** Symbol name. */ 78955ceef47f2bb8b5005abf11d4a8580c71f19e1bIan Romanick char *name; 79770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 80770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /** Linked list of symbols with the same name. */ 81770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct symbol *symbols; 82770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}; 83770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 84770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 85770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/** 86770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Element of the scope stack. 87770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 88770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct scope_level { 89770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /** Link to next (inner) scope level. */ 90770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct scope_level *next; 91770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 92770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /** Linked list of symbols with the same scope. */ 93770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct symbol *symbols; 94770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}; 95770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 96770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 97770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/** 98770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 99770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct _mesa_symbol_table { 101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /** Hash table containing all symbols in the symbol table. */ 102770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct hash_table *ht; 103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /** Top of scope stack. */ 105770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct scope_level *current_scope; 1060f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick 1070f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick /** List of all symbol headers in the table. */ 1080f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick struct symbol_header *hdr; 10984341f4b2014810b2964230384fe76338be1d78eIan Romanick 11084341f4b2014810b2964230384fe76338be1d78eIan Romanick /** Current scope depth. */ 11184341f4b2014810b2964230384fe76338be1d78eIan Romanick unsigned depth; 112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}; 113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct _mesa_symbol_table_iterator { 116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /** 117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Name space of symbols returned by this iterator. 118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int name_space; 120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /** 123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Currently iterated symbol 124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * The next call to \c _mesa_symbol_table_iterator_get will return this 126770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * value. It will also update this value to the value that should be 127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * returned by the next call. 128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct symbol *curr; 130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}; 131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void 134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickcheck_symbol_table(struct _mesa_symbol_table *table) 135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#if 1 137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct scope_level *scope; 138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick for (scope = table->current_scope; scope != NULL; scope = scope->next) { 140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct symbol *sym; 141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick for (sym = scope->symbols 143770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; sym != NULL 144770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; sym = sym->next_with_same_name) { 145770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick const struct symbol_header *const hdr = sym->hdr; 146770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct symbol *sym2; 147770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 148770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick for (sym2 = hdr->symbols 149770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; sym2 != NULL 150770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ; sym2 = sym2->next_with_same_name) { 151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick assert(sym2->hdr == hdr); 152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif 156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid 159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_pop_scope(struct _mesa_symbol_table *table) 160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 161770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct scope_level *const scope = table->current_scope; 162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct symbol *sym = scope->symbols; 163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 164770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick table->current_scope = scope->next; 16584341f4b2014810b2964230384fe76338be1d78eIan Romanick table->depth--; 166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick free(scope); 168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick while (sym != NULL) { 170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct symbol *const next = sym->next_with_same_scope; 171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct symbol_header *const hdr = sym->hdr; 172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick assert(hdr->symbols == sym); 174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick hdr->symbols = sym->next_with_same_name; 176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick free(sym); 178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick sym = next; 180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 181770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick check_symbol_table(table); 183770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid 187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_push_scope(struct _mesa_symbol_table *table) 188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct scope_level *const scope = calloc(1, sizeof(*scope)); 190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 191770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick scope->next = table->current_scope; 192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick table->current_scope = scope; 19384341f4b2014810b2964230384fe76338be1d78eIan Romanick table->depth++; 194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic struct symbol_header * 198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickfind_symbol(struct _mesa_symbol_table *table, const char *name) 199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return (struct symbol_header *) hash_table_find(table->ht, name); 201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct _mesa_symbol_table_iterator * 205770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_iterator_ctor(struct _mesa_symbol_table *table, 206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int name_space, const char *name) 207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct _mesa_symbol_table_iterator *iter = calloc(1, sizeof(*iter)); 209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct symbol_header *const hdr = find_symbol(table, name); 210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick iter->name_space = name_space; 212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 213770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (hdr != NULL) { 214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct symbol *sym; 215770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 216770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick for (sym = hdr->symbols; sym != NULL; sym = sym->next_with_same_name) { 217770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick assert(sym->hdr == hdr); 218770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 219770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ((name_space == -1) || (sym->name_space == name_space)) { 220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick iter->curr = sym; 221770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick break; 222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 225770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 226770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return iter; 227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid 231770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_iterator_dtor(struct _mesa_symbol_table_iterator *iter) 232770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 233770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick free(iter); 234770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 237770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid * 238770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_iterator_get(struct _mesa_symbol_table_iterator *iter) 239770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 240770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return (iter->curr == NULL) ? NULL : iter->curr->data; 241770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 242770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 243770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 244770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint 245770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_iterator_next(struct _mesa_symbol_table_iterator *iter) 246770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 247770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct symbol_header *hdr; 248770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 249770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (iter->curr == NULL) { 250770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 0; 251770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 252770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 253770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick hdr = iter->curr->hdr; 254770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick iter->curr = iter->curr->next_with_same_name; 255770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 256770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick while (iter->curr != NULL) { 257770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick assert(iter->curr->hdr == hdr); 258230cc36611346ad61610d6c19404e777878d7501Jakob Bornecrantz (void)hdr; 259770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 260770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ((iter->name_space == -1) 261770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick || (iter->curr->name_space == iter->name_space)) { 262770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 1; 263770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 264770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 265770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick iter->curr = iter->curr->next_with_same_name; 266770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 267770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 268770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 0; 269770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 270770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 271770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 27284341f4b2014810b2964230384fe76338be1d78eIan Romanick/** 27384341f4b2014810b2964230384fe76338be1d78eIan Romanick * Determine the scope "distance" of a symbol from the current scope 27484341f4b2014810b2964230384fe76338be1d78eIan Romanick * 27584341f4b2014810b2964230384fe76338be1d78eIan Romanick * \return 27684341f4b2014810b2964230384fe76338be1d78eIan Romanick * A non-negative number for the number of scopes between the current scope 27784341f4b2014810b2964230384fe76338be1d78eIan Romanick * and the scope where a symbol was defined. A value of zero means the current 27884341f4b2014810b2964230384fe76338be1d78eIan Romanick * scope. A negative number if the symbol does not exist. 27984341f4b2014810b2964230384fe76338be1d78eIan Romanick */ 28084341f4b2014810b2964230384fe76338be1d78eIan Romanickint 28184341f4b2014810b2964230384fe76338be1d78eIan Romanick_mesa_symbol_table_symbol_scope(struct _mesa_symbol_table *table, 28284341f4b2014810b2964230384fe76338be1d78eIan Romanick int name_space, const char *name) 28384341f4b2014810b2964230384fe76338be1d78eIan Romanick{ 28484341f4b2014810b2964230384fe76338be1d78eIan Romanick struct symbol_header *const hdr = find_symbol(table, name); 28584341f4b2014810b2964230384fe76338be1d78eIan Romanick struct symbol *sym; 28684341f4b2014810b2964230384fe76338be1d78eIan Romanick 28784341f4b2014810b2964230384fe76338be1d78eIan Romanick if (hdr != NULL) { 28884341f4b2014810b2964230384fe76338be1d78eIan Romanick for (sym = hdr->symbols; sym != NULL; sym = sym->next_with_same_name) { 28984341f4b2014810b2964230384fe76338be1d78eIan Romanick assert(sym->hdr == hdr); 29084341f4b2014810b2964230384fe76338be1d78eIan Romanick 29184341f4b2014810b2964230384fe76338be1d78eIan Romanick if ((name_space == -1) || (sym->name_space == name_space)) { 29284341f4b2014810b2964230384fe76338be1d78eIan Romanick assert(sym->depth <= table->depth); 29384341f4b2014810b2964230384fe76338be1d78eIan Romanick return sym->depth - table->depth; 29484341f4b2014810b2964230384fe76338be1d78eIan Romanick } 29584341f4b2014810b2964230384fe76338be1d78eIan Romanick } 29684341f4b2014810b2964230384fe76338be1d78eIan Romanick } 29784341f4b2014810b2964230384fe76338be1d78eIan Romanick 29884341f4b2014810b2964230384fe76338be1d78eIan Romanick return -1; 29984341f4b2014810b2964230384fe76338be1d78eIan Romanick} 30084341f4b2014810b2964230384fe76338be1d78eIan Romanick 30184341f4b2014810b2964230384fe76338be1d78eIan Romanick 302770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid * 303770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_find_symbol(struct _mesa_symbol_table *table, 304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int name_space, const char *name) 305770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 306770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct symbol_header *const hdr = find_symbol(table, name); 307770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 308770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (hdr != NULL) { 309770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct symbol *sym; 310770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 311770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 312770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick for (sym = hdr->symbols; sym != NULL; sym = sym->next_with_same_name) { 313770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick assert(sym->hdr == hdr); 314770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 315770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if ((name_space == -1) || (sym->name_space == name_space)) { 316770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return sym->data; 317770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 319770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 320770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 321770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return NULL; 322770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 323770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint 326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_add_symbol(struct _mesa_symbol_table *table, 327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick int name_space, const char *name, 328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick void *declaration) 329770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 3300dd08a9e15192dec7fd97febdbb39ce25a08a525Vinson Lee struct symbol_header *hdr; 3310dd08a9e15192dec7fd97febdbb39ce25a08a525Vinson Lee struct symbol *sym; 3320dd08a9e15192dec7fd97febdbb39ce25a08a525Vinson Lee 333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick check_symbol_table(table); 334770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 3350dd08a9e15192dec7fd97febdbb39ce25a08a525Vinson Lee hdr = find_symbol(table, name); 336770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 337770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick check_symbol_table(table); 338770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 339770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (hdr == NULL) { 340a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke hdr = calloc(1, sizeof(*hdr)); 341a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke hdr->name = strdup(name); 342770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 343a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke hash_table_insert(table->ht, hdr, hdr->name); 344a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke hdr->next = table->hdr; 345a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke table->hdr = hdr; 346770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 347770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 348770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick check_symbol_table(table); 349770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 35084341f4b2014810b2964230384fe76338be1d78eIan Romanick /* If the symbol already exists in this namespace at this scope, it cannot 35184341f4b2014810b2964230384fe76338be1d78eIan Romanick * be added to the table. 35284341f4b2014810b2964230384fe76338be1d78eIan Romanick */ 35384341f4b2014810b2964230384fe76338be1d78eIan Romanick for (sym = hdr->symbols 35484341f4b2014810b2964230384fe76338be1d78eIan Romanick ; (sym != NULL) && (sym->name_space != name_space) 35584341f4b2014810b2964230384fe76338be1d78eIan Romanick ; sym = sym->next_with_same_name) { 35684341f4b2014810b2964230384fe76338be1d78eIan Romanick /* empty */ 35784341f4b2014810b2964230384fe76338be1d78eIan Romanick } 35884341f4b2014810b2964230384fe76338be1d78eIan Romanick 35984341f4b2014810b2964230384fe76338be1d78eIan Romanick if (sym && (sym->depth == table->depth)) 36084341f4b2014810b2964230384fe76338be1d78eIan Romanick return -1; 36184341f4b2014810b2964230384fe76338be1d78eIan Romanick 362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick sym = calloc(1, sizeof(*sym)); 363770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick sym->next_with_same_name = hdr->symbols; 364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick sym->next_with_same_scope = table->current_scope->symbols; 365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick sym->hdr = hdr; 366770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick sym->name_space = name_space; 367770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick sym->data = declaration; 36884341f4b2014810b2964230384fe76338be1d78eIan Romanick sym->depth = table->depth; 369770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick assert(sym->hdr == hdr); 371770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 372770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick hdr->symbols = sym; 373770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick table->current_scope->symbols = sym; 374770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 375770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick check_symbol_table(table); 376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 0; 377770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 378770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 379770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 380a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunkeint 381a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke_mesa_symbol_table_add_global_symbol(struct _mesa_symbol_table *table, 382a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke int name_space, const char *name, 383a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke void *declaration) 384a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke{ 385a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke struct symbol_header *hdr; 386a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke struct symbol *sym; 387a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke struct symbol *curr; 388a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke struct scope_level *top_scope; 389a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke 390a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke check_symbol_table(table); 391a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke 392a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke hdr = find_symbol(table, name); 393a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke 394a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke check_symbol_table(table); 395a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke 396a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke if (hdr == NULL) { 397a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke hdr = calloc(1, sizeof(*hdr)); 398a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke hdr->name = strdup(name); 399a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke 400a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke hash_table_insert(table->ht, hdr, hdr->name); 401a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke hdr->next = table->hdr; 402a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke table->hdr = hdr; 403a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke } 404a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke 405a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke check_symbol_table(table); 406a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke 407a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke /* If the symbol already exists in this namespace at this scope, it cannot 408a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke * be added to the table. 409a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke */ 410a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke for (sym = hdr->symbols 411a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke ; (sym != NULL) && (sym->name_space != name_space) 412a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke ; sym = sym->next_with_same_name) { 413a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke /* empty */ 414a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke } 415a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke 416a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke if (sym && sym->depth == 0) 417a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke return -1; 418a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke 419a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke /* Find the top-level scope */ 420a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke for (top_scope = table->current_scope 421a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke ; top_scope->next != NULL 422a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke ; top_scope = top_scope->next) { 423a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke /* empty */ 424a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke } 425a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke 426a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke sym = calloc(1, sizeof(*sym)); 427a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke sym->next_with_same_scope = top_scope->symbols; 428a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke sym->hdr = hdr; 429a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke sym->name_space = name_space; 430a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke sym->data = declaration; 431a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke 432a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke assert(sym->hdr == hdr); 433a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke 434a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke /* Since next_with_same_name is ordered by scope, we need to append the 435a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke * new symbol to the _end_ of the list. 436a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke */ 437a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke if (hdr->symbols == NULL) { 438a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke hdr->symbols = sym; 439a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke } else { 440a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke for (curr = hdr->symbols 441a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke ; curr->next_with_same_name != NULL 442a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke ; curr = curr->next_with_same_name) { 443a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke /* empty */ 444a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke } 445a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke curr->next_with_same_name = sym; 446a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke } 447a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke top_scope->symbols = sym; 448a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke 449a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke check_symbol_table(table); 450a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke return 0; 451a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke} 452a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke 453a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke 454a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke 455770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct _mesa_symbol_table * 456770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_ctor(void) 457770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 458770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct _mesa_symbol_table *table = calloc(1, sizeof(*table)); 459770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 460946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick if (table != NULL) { 461946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick table->ht = hash_table_ctor(32, hash_table_string_hash, 462946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick hash_table_string_compare); 463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 464946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick _mesa_symbol_table_push_scope(table); 465946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick } 466770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 467770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return table; 468770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 469946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick 470946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick 471946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanickvoid 472946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick_mesa_symbol_table_dtor(struct _mesa_symbol_table *table) 473946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick{ 4740f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick struct symbol_header *hdr; 4750f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick struct symbol_header *next; 4760f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick 477946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick while (table->current_scope != NULL) { 478946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick _mesa_symbol_table_pop_scope(table); 479946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick } 480946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick 4810f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick for (hdr = table->hdr; hdr != NULL; hdr = next) { 4820f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick next = hdr->next; 483955ceef47f2bb8b5005abf11d4a8580c71f19e1bIan Romanick free(hdr->name); 48432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(hdr); 4850f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick } 4860f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick 487946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick hash_table_dtor(table->ht); 488946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick free(table); 489946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick} 490