38 symdict = (
struct symdict *)
calloc(1,
sizeof(*symdict));
59 retval += g_hash_table_size(symdict->
tab);
61 retval += g_hash_table_size(symdict->
duptab);
63 retval += g_hash_table_size(symdict->
anontab);
75 retval += g_hash_table_size(symdict->
tab);
77 g_hash_table_iter_init(&iter,symdict->
duptab);
78 while (g_hash_table_iter_next(&iter,NULL,&value)) {
80 retval += array_list_len(duplist);
84 retval += g_hash_table_size(symdict->
anontab);
96 retval += g_hash_table_size(symdict->
tab);
98 g_hash_table_iter_init(&iter,symdict->
duptab);
99 while (g_hash_table_iter_next(&iter,NULL,&value)) {
101 retval += array_list_len(duplist);
115 *named = g_hash_table_size(symdict->
tab);
122 g_hash_table_iter_init(&iter,symdict->
duptab);
123 while (g_hash_table_iter_next(&iter,NULL,&value)) {
125 *duplicated += array_list_len(duplist);
133 *anon = g_hash_table_size(symdict->
anontab);
143 struct symbol *exsym = NULL;
149 g_hash_table_lookup(symdict->
duptab,name)))) {
150 array_list_append(exlist,symbol);
156 else if (symdict->
tab
157 &&
unlikely((exsym = (
struct symbol *) \
158 g_hash_table_lookup(symdict->
tab,name)))) {
159 exlist = array_list_create(2);
160 array_list_append(exlist,exsym);
161 array_list_append(exlist,symbol);
162 g_hash_table_steal(symdict->
tab,name);
164 symdict->
duptab = g_hash_table_new(g_str_hash,g_str_equal);
165 g_hash_table_insert(symdict->
duptab,name,exlist);
173 symdict->
tab = g_hash_table_new(g_str_hash,g_str_equal);
174 g_hash_table_insert(symdict->
tab,name,symbol);
179 else if (symbol->
ref) {
182 (gpointer)(uintptr_t)symbol->
ref))) {
183 verror(
"tried to insert duplicate anonymous symbol"
188 symdict->
anontab = g_hash_table_new(g_direct_hash,g_direct_equal);
189 g_hash_table_insert(symdict->
anontab,
190 (gpointer)(uintptr_t)symbol->
ref,symbol);
195 verror(
"tried to insert non-anonymous symbol with no name/ref"
203 verror(
"tried to insert anonymous symbol with no ref -- BUG!\n");
209 (gpointer)(uintptr_t)symbol->
ref))) {
210 verror(
"tried to insert duplicate anonymous symbol"
215 symdict->
anontab = g_hash_table_new(g_direct_hash,g_direct_equal);
217 g_hash_table_insert(symdict->
anontab,
218 (gpointer)(uintptr_t)symbol->
ref,symbol);
225 struct symbol *exsym = NULL;
232 g_hash_table_lookup(symdict->
duptab,name)))) {
233 array_list_remove_item(exlist,symbol);
234 if (array_list_len(exlist) == 1) {
235 g_hash_table_remove(symdict->
duptab,name);
236 exsym = (
struct symbol *)array_list_item(exlist,0);
237 array_list_free(exlist);
238 g_hash_table_insert(symdict->
tab,name,exsym);
241 else if (symdict->
tab && g_hash_table_lookup(symdict->
tab,name)) {
242 g_hash_table_remove(symdict->
tab,name);
246 name,symbol->
ref,symdict);
251 && g_hash_table_lookup(symdict->
anontab,
252 (gpointer)(uintptr_t)symbol->
ref)) {
253 g_hash_table_remove(symdict->
anontab,(gpointer)(uintptr_t)symbol->
ref);
257 name,symbol->
ref,symdict);
264 static void _symdict_symbol_dtor(
struct symbol *
symbol,
void *priv) {
269 _symdict_symbol_dtor;
282 g_hash_table_iter_init(&iter,symdict->
tab);
283 while (g_hash_table_iter_next(&iter,NULL,&vp)) {
284 symbol = (
struct symbol *)vp;
286 g_hash_table_iter_remove(&iter);
288 g_hash_table_destroy(symdict->
tab);
292 g_hash_table_iter_init(&iter,symdict->
duptab);
293 while (g_hash_table_iter_next(&iter,NULL,&vp)) {
298 array_list_free(list);
299 g_hash_table_iter_remove(&iter);
301 g_hash_table_destroy(symdict->
duptab);
305 g_hash_table_iter_init(&iter,symdict->
anontab);
306 while (g_hash_table_iter_next(&iter,NULL,&vp)) {
307 symbol = (
struct symbol *)vp;
309 g_hash_table_iter_remove(&iter);
311 g_hash_table_destroy(symdict->
anontab);
324 np =
malloc(strlen(p) + 1 + 2);
325 sprintf(np,
"%s%s",p,
" ");
352 struct symbol *svalue;
356 && (svalue = (
struct symbol *)g_hash_table_lookup(symdict->
tab,name))
373 "found non-type, non-definition %s\n",
383 g_hash_table_lookup(symdict->
duptab,name))) {
384 for (i = 0; i < array_list_len(duplist); ++
i) {
385 svalue = (
struct symbol *)array_list_item(duplist,i);
401 "found dup type %s; saving and continuing search\n",
408 "found dup non-type, non-definition %s;"
409 " saving and continuing search\n",
422 int no_main,
int no_dup,
int no_anon) {
431 GSList *retval = NULL;
433 if (!no_main && symdict->
tab) {
434 g_hash_table_iter_init(&iter,symdict->
tab);
435 while (g_hash_table_iter_next(&iter,&key,&value)) {
437 symbol = (
struct symbol *)value;
439 rfilter_check(symbol_filter,name,&accept,NULL);
441 retval = g_slist_prepend(retval,symbol);
446 if (!no_dup && symdict->
duptab) {
447 g_hash_table_iter_init(&iter,symdict->
duptab);
448 while (g_hash_table_iter_next(&iter,&key,&value)) {
456 rfilter_check(symbol_filter,name,&accept,NULL);
458 for (i = 0; i < array_list_len(duplist); ++
i) {
459 symbol = (
struct symbol *)array_list_item(duplist,i);
461 retval = g_slist_prepend(retval,symbol);
468 if (!no_anon && !symbol_filter && symdict->
anontab) {
469 g_hash_table_iter_init(&iter,symdict->
anontab);
470 while (g_hash_table_iter_next(&iter,NULL,&value)) {
471 symbol = (
struct symbol *)value;
473 retval = g_slist_prepend(retval,symbol);
int symdict_remove_symbol(struct symdict *symdict, struct symbol *symbol)
symdict_symbol_dtor_t default_symdict_symbol_dtor
int symdict_get_size(struct symdict *symdict)
static uint64_t unsigned int i
void symdict_free(struct symdict *symdict, symdict_symbol_dtor_t ssd, void *priv)
struct symdict * symdict_create(void)
REFCNT symbol_free(struct symbol *symbol, int force)
int symdict_get_sizes(struct symdict *symdict, int *named, int *duplicated, int *anon)
#define verror(format,...)
int symdict_insert_symbol_anon(struct symdict *symdict, struct symbol *symbol)
int symdict_get_size_simple(struct symdict *symdict)
struct symbol * symdict_get_sym(struct symdict *symdict, const char *name, symbol_type_flag_t flags)
void g_hash_foreach_dump_symbol(gpointer key __attribute__((unused)), gpointer value, gpointer userdata)
int symdict_insert_symbol(struct symdict *symdict, struct symbol *symbol)
#define array_list_foreach(alist, lpc, placeholder)
#define SYMBOL_TYPE_FLAG_MATCHES(sym, flags)
void(* symdict_symbol_dtor_t)(struct symbol *symbol, void *priv)
#define vdebug(devel, areas, flags, format,...)
unsigned int isdeclaration
#define SYMBOL_IS_TYPE(sym)
void * calloc(size_t nmemb, size_t size)
GSList * symdict_match_syms_by_tab(struct symdict *symdict, struct rfilter *symbol_filter, symbol_type_flag_t flags, int no_main, int no_dup, int no_anon)
int symdict_get_size_named(struct symdict *symdict)
GSList * symdict_match_syms(struct symdict *symdict, struct rfilter *symbol_filter, symbol_type_flag_t flags)
void g_hash_foreach_dump_symbol_list(gpointer key __attribute__((unused)), gpointer value, gpointer userdata)
char * symbol_get_name(struct symbol *symbol)
void * malloc(size_t size)
void symdict_dump(struct symdict *symdict, struct dump_info *ud)
int symbol_is_definition(struct symbol *symbol)
int vdebug_is_on(int level, log_areas_t areas, log_flags_t flags)