Lines Matching refs:sym

20 static unsigned int __for_each_addr(struct symbol *sym, symbol_callback_t func,
28 symbol_addr_hash(&sym->addr)) {
29 if (match == sym)
32 if (match->addr.section == sym->addr.section &&
33 match->addr.address == sym->addr.address) {
85 static void set_crc(struct symbol *sym, void *data)
89 if (sym->state == SYMBOL_PROCESSED && sym->crc != *crc)
91 sym->name, sym->crc, *crc);
93 sym->state = SYMBOL_PROCESSED;
94 sym->crc = *crc;
97 void symbol_set_crc(struct symbol *sym, unsigned long crc)
99 if (for_each(sym->name, set_crc, &crc) == 0)
100 error("no matching symbols: '%s'", sym->name);
103 static void set_ptr(struct symbol *sym, void *data)
105 sym->ptr_die_addr = (uintptr_t)((Dwarf_Die *)data)->addr;
108 void symbol_set_ptr(struct symbol *sym, Dwarf_Die *ptr)
110 if (for_each(sym->name, set_ptr, ptr) == 0)
111 error("no matching symbols: '%s'", sym->name);
114 static void set_die(struct symbol *sym, void *data)
116 sym->die_addr = (uintptr_t)((Dwarf_Die *)data)->addr;
117 sym->state = SYMBOL_MAPPED;
120 void symbol_set_die(struct symbol *sym, Dwarf_Die *die)
122 if (for_each(sym->name, set_die, die) == 0)
123 error("no matching symbols: '%s'", sym->name);
133 struct symbol *sym;
149 sym = xcalloc(1, sizeof(*sym));
150 sym->name = name;
151 sym->addr.section = SHN_UNDEF;
152 sym->state = SYMBOL_UNPROCESSED;
154 hash_add(symbol_names, &sym->name_hash, hash_str(sym->name));
157 debug("%s", sym->name);
164 static void get_symbol(struct symbol *sym, void *arg)
168 if (sym->state == SYMBOL_UNPROCESSED)
169 *res = sym;
174 struct symbol *sym = NULL;
176 for_each(name, get_symbol, &sym);
177 return sym;
183 struct symbol *sym;
185 hash_for_each_safe(symbol_names, sym, tmp, name_hash) {
186 func(sym, arg);
190 typedef void (*elf_symbol_callback_t)(const char *name, GElf_Sym *sym,
252 GElf_Sym *sym;
254 sym = gelf_getsymshndx(data, xndx_data, n,
256 if (!sym)
260 if (GELF_ST_BIND(sym->st_info) == STB_LOCAL)
263 if (sym->st_shndx != SHN_XINDEX)
264 xndx = sym->st_shndx;
267 sym->st_name);
274 func(name, sym, xndx, arg);
284 static void set_symbol_addr(struct symbol *sym, void *arg)
288 if (sym->addr.section == SHN_UNDEF) {
289 sym->addr = *addr;
290 hash_add(symbol_addrs, &sym->addr_hash,
291 symbol_addr_hash(&sym->addr));
293 debug("%s -> { %u, %lx }", sym->name, sym->addr.section,
294 sym->addr.address);
295 } else if (sym->addr.section != addr->section ||
296 sym->addr.address != addr->address) {
297 warn("multiple addresses for symbol %s?", sym->name);
301 static void elf_set_symbol_addr(const char *name, GElf_Sym *sym,
304 struct symbol_addr addr = { .section = xndx, .address = sym->st_value };
319 struct symbol *sym;
321 hash_for_each_safe(symbol_names, sym, tmp, name_hash) {
322 if (sym->state != SYMBOL_PROCESSED)
323 warn("no information for symbol %s", sym->name);
325 printf("#SYMVER %s 0x%08lx\n", sym->name, sym->crc);
332 struct symbol *sym;
334 hash_for_each_safe(symbol_names, sym, tmp, name_hash) {
335 free((void *)sym->name);
336 free(sym);