#include "symtab_asm.h" static u32_t hash_func(const symasm_entry_t* key) { return rt_strhash(key->name); } static int cmp_func(const symasm_entry_t* k1, const symasm_entry_t* k2) { return rt_strcmp(k1->name, k2->name); } void init_symtab_asm(symtab_asm_t* symtab) { init_hashtable(&symtab->symtab); symtab->symtab.hash_func = (u32_t(*)(const void*))hash_func; symtab->symtab.key_cmp = (int(*)(const void*, const void*))cmp_func; } void symtab_asm_put(symtab_asm_t* symtab, symasm_entry_t* _entry, u32_t address) { // FIXME maybe memory leak u32_t* addr = salloc_alloc(sizeof(u32_t)); if (addr == NULL) { LOG_FATAL("salloc_alloc failure"); } symasm_entry_t* entry = salloc_alloc(sizeof(symasm_entry_t)); if (entry == NULL) LOG_FATAL("malloc failure"); *entry = *_entry; *addr = address; void* ret = hashtable_set(&symtab->symtab, entry, addr); if (ret != NULL) { LOG_ERROR("Symbol %s already exists", entry->name); } } u32_t* symtab_asm_get(symtab_asm_t* symtab, symasm_entry_t* entry) { u32_t* addr = hashtable_get(&symtab->symtab, entry); return addr; } void symtab_asm_destroy(symtab_asm_t* symtab) { hashtable_destory(&symtab->symtab); }