stable
This commit is contained in:
40
assembler/riscv32/symtab_asm.c
Normal file
40
assembler/riscv32/symtab_asm.c
Normal file
@@ -0,0 +1,40 @@
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user