diff mbox

elf: Improve symbol lookup (optimize, fix for bsd-user)

Message ID 1325774379-14397-1-git-send-email-sw@weilnetz.de
State Accepted
Headers show

Commit Message

Stefan Weil Jan. 5, 2012, 2:39 p.m. UTC
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>
---
 bsd-user/elfload.c   |   11 ++++-------
 hw/elf_ops.h         |   12 +++++-------
 linux-user/elfload.c |   11 ++++-------
 3 files changed, 13 insertions(+), 21 deletions(-)

Comments

andrzej zaborowski Jan. 10, 2012, 5:36 p.m. UTC | #1
On 5 January 2012 15:39, Stefan Weil <sw@weilnetz.de> wrote:
> 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.

Thanks, applied.

Cheers
diff mbox

Patch

diff --git a/bsd-user/elfload.c b/bsd-user/elfload.c
index 1288884..6053648 100644
--- a/bsd-user/elfload.c
+++ b/bsd-user/elfload.c
@@ -993,12 +993,12 @@  static abi_ulong load_elf_interp(struct elfhdr * interp_elf_ex,
 
 static int symfind(const void *s0, const void *s1)
 {
-    struct elf_sym *key = (struct elf_sym *)s0;
+    target_ulong addr = *(target_ulong *)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;
@@ -1013,12 +1013,9 @@  static const char *lookup_symbolxx(struct syminfo *s, target_ulong orig_addr)
 #endif
 
     // binary search
-    struct elf_sym key;
     struct elf_sym *sym;
 
-    key.st_value = orig_addr;
-
-    sym = bsearch(&key, syms, s->disas_num_syms, sizeof(*syms), symfind);
+    sym = bsearch(&orig_addr, syms, s->disas_num_syms, sizeof(*syms), symfind);
     if (sym != NULL) {
         return s->disas_strtab + sym->st_name;
     }
diff --git a/hw/elf_ops.h b/hw/elf_ops.h
index 6af357f..482145f 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;
     }
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index ea61d0d..a8e6f41 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -1683,12 +1683,12 @@  static void load_elf_interp(const char *filename, struct image_info *info,
 
 static int symfind(const void *s0, const void *s1)
 {
-    struct elf_sym *key = (struct elf_sym *)s0;
+    target_ulong addr = *(target_ulong *)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;
@@ -1703,12 +1703,9 @@  static const char *lookup_symbolxx(struct syminfo *s, target_ulong orig_addr)
 #endif
 
     // binary search
-    struct elf_sym key;
     struct elf_sym *sym;
 
-    key.st_value = orig_addr;
-
-    sym = bsearch(&key, syms, s->disas_num_syms, sizeof(*syms), symfind);
+    sym = bsearch(&orig_addr, syms, s->disas_num_syms, sizeof(*syms), symfind);
     if (sym != NULL) {
         return s->disas_strtab + sym->st_name;
     }