diff options
author | Stefan Weil <sw@weilnetz.de> | 2012-01-05 15:39:39 +0100 |
---|---|---|
committer | Andrzej Zaborowski <andrew.zaborowski@intel.com> | 2012-01-10 18:40:09 +0100 |
commit | c7c530cd3e23219a9be10323ba7876f68d54c107 (patch) | |
tree | 78e52ee094cafd6e4b1c7bc86635d6ccaa72879f /hw | |
parent | 563c2bf35cf4a20b504dd371c395d987f67e16d4 (diff) |
elf: Improve symbol lookup (optimize, fix for bsd-user)
Coverity complained about local variable key which was only partially
initiated. Only key.st_value was set. As this was also the only part
of key which was used in function symfind, the code could be optimized
by directly passing a pointer to orig_addr.
In bsd-user/elfload.c, fix ec822001a2f26eef8701194714f6482b6d852de2
was missing. This was a simple replacement of > by >= in symfind, so
I fixed it here without creating an additional patch.
Signed-off-by: Stefan Weil <sw@weilnetz.de>
Signed-off-by: Andrzej Zaborowski <andrew.zaborowski@intel.com>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/elf_ops.h | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/hw/elf_ops.h b/hw/elf_ops.h index 6af357fc13..fa65ce2f93 100644 --- a/hw/elf_ops.h +++ b/hw/elf_ops.h @@ -62,12 +62,12 @@ static struct elf_shdr *glue(find_section, SZ)(struct elf_shdr *shdr_table, static int glue(symfind, SZ)(const void *s0, const void *s1) { - struct elf_sym *key = (struct elf_sym *)s0; + target_phys_addr_t addr = *(target_phys_addr_t *)s0; struct elf_sym *sym = (struct elf_sym *)s1; int result = 0; - if (key->st_value < sym->st_value) { + if (addr < sym->st_value) { result = -1; - } else if (key->st_value >= sym->st_value + sym->st_size) { + } else if (addr >= sym->st_value + sym->st_size) { result = 1; } return result; @@ -77,12 +77,10 @@ static const char *glue(lookup_symbol, SZ)(struct syminfo *s, target_phys_addr_t orig_addr) { struct elf_sym *syms = glue(s->disas_symtab.elf, SZ); - struct elf_sym key; struct elf_sym *sym; - key.st_value = orig_addr; - - sym = bsearch(&key, syms, s->disas_num_syms, sizeof(*syms), glue(symfind, SZ)); + sym = bsearch(&orig_addr, syms, s->disas_num_syms, sizeof(*syms), + glue(symfind, SZ)); if (sym != NULL) { return s->disas_strtab + sym->st_name; } |