Create a common helper to add symbols.

Signed-off-by: Peter Zijlstra (Intel) <pet...@infradead.org>
---
 tools/objtool/elf.c |   57 ++++++++++++++++++++++++++++++----------------------
 1 file changed, 33 insertions(+), 24 deletions(-)

--- a/tools/objtool/elf.c
+++ b/tools/objtool/elf.c
@@ -290,12 +290,41 @@ static int read_sections(struct elf *elf
        return 0;
 }
 
+static bool elf_symbol_add(struct elf *elf, struct symbol *sym)
+{
+       struct list_head *entry;
+       struct rb_node *pnode;
+
+       sym->type = GELF_ST_TYPE(sym->sym.st_info);
+       sym->bind = GELF_ST_BIND(sym->sym.st_info);
+
+       sym->offset = sym->sym.st_value;
+       sym->len = sym->sym.st_size;
+
+       rb_add(&sym->node, &sym->sec->symbol_tree, symbol_to_offset);
+       pnode = rb_prev(&sym->node);
+       if (pnode)
+               entry = &rb_entry(pnode, struct symbol, node)->list;
+       else
+               entry = &sym->sec->symbol_list;
+       list_add(&sym->list, entry);
+       elf_hash_add(elf->symbol_hash, &sym->hash, sym->idx);
+       elf_hash_add(elf->symbol_name_hash, &sym->name_hash, 
str_hash(sym->name));
+
+       /*
+        * Don't store empty STT_NOTYPE symbols in the rbtree.  They
+        * can exist within a function, confusing the sorting.
+        */
+       if (!sym->len)
+               rb_erase(&sym->node, &sym->sec->symbol_tree);
+
+       return true;
+}
+
 static int read_symbols(struct elf *elf)
 {
        struct section *symtab, *symtab_shndx, *sec;
        struct symbol *sym, *pfunc;
-       struct list_head *entry;
-       struct rb_node *pnode;
        int symbols_nr, i;
        char *coldstr;
        Elf_Data *shndx_data = NULL;
@@ -340,9 +369,6 @@ static int read_symbols(struct elf *elf)
                        goto err;
                }
 
-               sym->type = GELF_ST_TYPE(sym->sym.st_info);
-               sym->bind = GELF_ST_BIND(sym->sym.st_info);
-
                if ((sym->sym.st_shndx > SHN_UNDEF &&
                     sym->sym.st_shndx < SHN_LORESERVE) ||
                    (shndx_data && sym->sym.st_shndx == SHN_XINDEX)) {
@@ -362,25 +388,8 @@ static int read_symbols(struct elf *elf)
                } else
                        sym->sec = find_section_by_index(elf, 0);
 
-               sym->offset = sym->sym.st_value;
-               sym->len = sym->sym.st_size;
-
-               rb_add(&sym->node, &sym->sec->symbol_tree, symbol_to_offset);
-               pnode = rb_prev(&sym->node);
-               if (pnode)
-                       entry = &rb_entry(pnode, struct symbol, node)->list;
-               else
-                       entry = &sym->sec->symbol_list;
-               list_add(&sym->list, entry);
-               elf_hash_add(elf->symbol_hash, &sym->hash, sym->idx);
-               elf_hash_add(elf->symbol_name_hash, &sym->name_hash, 
str_hash(sym->name));
-
-               /*
-                * Don't store empty STT_NOTYPE symbols in the rbtree.  They
-                * can exist within a function, confusing the sorting.
-                */
-               if (!sym->len)
-                       rb_erase(&sym->node, &sym->sec->symbol_tree);
+               if (!elf_symbol_add(elf, sym))
+                       goto err;
        }
 
        if (stats)


Reply via email to