41 lines
1.2 KiB
C
41 lines
1.2 KiB
C
#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);
|
|
}
|