int _mesa_symbol_table_add_symbol(struct _mesa_symbol_table *table, int name_space, const char *name, void *declaration) { struct symbol_header *hdr; struct symbol *sym; check_symbol_table(table); hdr = find_symbol(table, name); check_symbol_table(table); if (hdr == NULL) { hdr = calloc(1, sizeof(*hdr)); hdr->name = strdup(name); hash_table_insert(table->ht, hdr, hdr->name); hdr->next = table->hdr; table->hdr = hdr; } check_symbol_table(table); /* If the symbol already exists in this namespace at this scope, it cannot * be added to the table. */ for (sym = hdr->symbols ; (sym != NULL) && (sym->name_space != name_space) ; sym = sym->next_with_same_name) { /* empty */ } if (sym && (sym->depth == table->depth)) return -1; sym = calloc(1, sizeof(*sym)); sym->next_with_same_name = hdr->symbols; sym->next_with_same_scope = table->current_scope->symbols; sym->hdr = hdr; sym->name_space = name_space; sym->data = declaration; sym->depth = table->depth; assert(sym->hdr == hdr); hdr->symbols = sym; table->current_scope->symbols = sym; check_symbol_table(table); return 0; }
void _mesa_symbol_table_pop_scope(struct _mesa_symbol_table *table) { struct scope_level *const scope = table->current_scope; struct symbol *sym = scope->symbols; table->current_scope = scope->next; table->depth--; free(scope); while (sym != NULL) { struct symbol *const next = sym->next_with_same_scope; struct symbol_header *const hdr = sym->hdr; assert(hdr->symbols == sym); hdr->symbols = sym->next_with_same_name; free(sym); sym = next; } check_symbol_table(table); }
int main(int argc, char **argv) { assert(argc > 1); char *filename = argv[1]; if (elf_version(EV_CURRENT) == EV_NONE ) { /* library out of date */ fprintf(stderr, "Elf library out of date!n"); exit(-1); } int fd = open(argv[1], O_RDONLY); if ((elf = elf_begin(fd, ELF_C_READ, NULL)) == NULL){ /*error*/ } check_symbol_table() && print_symbols(elf, symtab_section, &symtab_shdr); }
int _mesa_symbol_table_add_global_symbol(struct _mesa_symbol_table *table, int name_space, const char *name, void *declaration) { struct symbol_header *hdr; struct symbol *sym; struct symbol *curr; struct scope_level *top_scope; check_symbol_table(table); hdr = find_symbol(table, name); check_symbol_table(table); if (hdr == NULL) { hdr = calloc(1, sizeof(*hdr)); hdr->name = strdup(name); hash_table_insert(table->ht, hdr, hdr->name); hdr->next = table->hdr; table->hdr = hdr; } check_symbol_table(table); /* If the symbol already exists in this namespace at this scope, it cannot * be added to the table. */ for (sym = hdr->symbols ; (sym != NULL) && (sym->name_space != name_space) ; sym = sym->next_with_same_name) { /* empty */ } if (sym && sym->depth == 0) return -1; /* Find the top-level scope */ for (top_scope = table->current_scope ; top_scope->next != NULL ; top_scope = top_scope->next) { /* empty */ } sym = calloc(1, sizeof(*sym)); sym->next_with_same_scope = top_scope->symbols; sym->hdr = hdr; sym->name_space = name_space; sym->data = declaration; assert(sym->hdr == hdr); /* Since next_with_same_name is ordered by scope, we need to append the * new symbol to the _end_ of the list. */ if (hdr->symbols == NULL) { hdr->symbols = sym; } else { for (curr = hdr->symbols ; curr->next_with_same_name != NULL ; curr = curr->next_with_same_name) { /* empty */ } curr->next_with_same_name = sym; } top_scope->symbols = sym; check_symbol_table(table); return 0; }