From: Timm Bäder <tbae...@redhat.com>

The no_symtab_updates() function was being called at the beginning of
all case labels in this switch, so we can just call it once before the
switch. Then it only has one call-site, so inline this short function
there.

Signed-off-by: Timm Bäder <tbae...@redhat.com>
---
 src/strip.c | 152 ++++++++++++++++++++++++----------------------------
 1 file changed, 69 insertions(+), 83 deletions(-)

diff --git a/src/strip.c b/src/strip.c
index e608dc5e..dd1e27ac 100644
--- a/src/strip.c
+++ b/src/strip.c
@@ -2175,98 +2175,91 @@ handle_elf (int fd, Elf *elf, const char *prefix, const 
char *fname,
     /* Find all relocation sections which use this symbol table.  */
     for (cnt = 1; cnt <= shdridx; ++cnt)
       {
-       if (shdr_info[cnt].idx == 0 && debug_fname == NULL)
+       struct shdr_info *info = &shdr_info[cnt];
+       if (info->idx == 0 && debug_fname == NULL)
          /* Ignore sections which are discarded.  When we are saving a
             relocation section in a separate debug file, we must fix up
             the symbol table references.  */
          continue;
 
-       const Elf32_Word symtabidx = shdr_info[cnt].old_sh_link;
+       const Elf32_Word symtabidx = info->old_sh_link;
        elf_assert (symtabidx < shnum + 2);
        const Elf32_Word *const newsymidx = shdr_info[symtabidx].newsymidx;
-       switch (shdr_info[cnt].shdr.sh_type)
-         {
-           inline bool no_symtab_updates (void)
-           {
-             /* If the symbol table hasn't changed, do not do anything.  */
-             if (shdr_info[symtabidx].newsymidx == NULL)
-               return true;
-
-             /* If the symbol table is not discarded, but additionally
-                duplicated in the separate debug file and this section
-                is discarded, don't adjust anything.  */
-             return (shdr_info[cnt].idx == 0
-                     && shdr_info[symtabidx].debug_data != NULL);
-           }
 
+       /* If the symbol table hasn't changed, do not do anything.  */
+       if (newsymidx == NULL)
+         continue;
+
+       /* If the symbol table is not discarded, but additionally
+          duplicated in the separate debug file and this section
+          is discarded, don't adjust anything.  */
+       if (info->idx == 0 && shdr_info[symtabidx].debug_data != NULL)
+         continue;
+
+       switch (info->shdr.sh_type)
+         {
          case SHT_REL:
          case SHT_RELA:
-           if (no_symtab_updates ())
-             break;
-
-           Elf_Data *d = elf_getdata (shdr_info[cnt].idx == 0
-                                      ? elf_getscn (debugelf, cnt)
-                                      : elf_getscn (newelf,
-                                                    shdr_info[cnt].idx),
-                                      NULL);
-           elf_assert (d != NULL && d->d_buf != NULL
-                       && shdr_info[cnt].shdr.sh_entsize != 0);
-           size_t nrels = (shdr_info[cnt].shdr.sh_size
-                           / shdr_info[cnt].shdr.sh_entsize);
-
-           size_t symsize = gelf_fsize (elf, ELF_T_SYM, 1, EV_CURRENT);
-           const Elf32_Word symidxn = (shdr_info[symtabidx].data->d_size
-                                       / symsize);
-           if (shdr_info[cnt].shdr.sh_type == SHT_REL)
-             for (size_t relidx = 0; relidx < nrels; ++relidx)
-               {
-                 GElf_Rel rel_mem;
-                 if (gelf_getrel (d, relidx, &rel_mem) == NULL)
-                   INTERNAL_ERROR (fname);
+           {
+             Elf_Data *d = elf_getdata (info->idx == 0
+                                        ? elf_getscn (debugelf, cnt)
+                                        : elf_getscn (newelf, info->idx),
+                                        NULL);
+             elf_assert (d != NULL && d->d_buf != NULL
+                         && info->shdr.sh_entsize != 0);
+             size_t nrels = (info->shdr.sh_size / info->shdr.sh_entsize);
+
+             size_t symsize = gelf_fsize (elf, ELF_T_SYM, 1, EV_CURRENT);
+             const Elf32_Word symidxn = (shdr_info[symtabidx].data->d_size
+                                         / symsize);
+             if (info->shdr.sh_type == SHT_REL)
+               for (size_t relidx = 0; relidx < nrels; ++relidx)
+                 {
+                   GElf_Rel rel_mem;
+                   if (gelf_getrel (d, relidx, &rel_mem) == NULL)
+                     INTERNAL_ERROR (fname);
 
-                 size_t symidx = GELF_R_SYM (rel_mem.r_info);
-                 elf_assert (symidx < symidxn);
-                 if (newsymidx[symidx] != symidx)
-                   {
-                     rel_mem.r_info
-                       = GELF_R_INFO (newsymidx[symidx],
-                                      GELF_R_TYPE (rel_mem.r_info));
+                   size_t symidx = GELF_R_SYM (rel_mem.r_info);
+                   elf_assert (symidx < symidxn);
+                   if (newsymidx[symidx] != symidx)
+                     {
+                       rel_mem.r_info
+                         = GELF_R_INFO (newsymidx[symidx],
+                                        GELF_R_TYPE (rel_mem.r_info));
 
-                     if (gelf_update_rel (d, relidx, &rel_mem) == 0)
-                       INTERNAL_ERROR (fname);
-                   }
-               }
-           else
-             for (size_t relidx = 0; relidx < nrels; ++relidx)
-               {
-                 GElf_Rela rel_mem;
-                 if (gelf_getrela (d, relidx, &rel_mem) == NULL)
-                   INTERNAL_ERROR (fname);
+                       if (gelf_update_rel (d, relidx, &rel_mem) == 0)
+                         INTERNAL_ERROR (fname);
+                     }
+                 }
+             else
+               for (size_t relidx = 0; relidx < nrels; ++relidx)
+                 {
+                   GElf_Rela rel_mem;
+                   if (gelf_getrela (d, relidx, &rel_mem) == NULL)
+                     INTERNAL_ERROR (fname);
 
-                 size_t symidx = GELF_R_SYM (rel_mem.r_info);
-                 elf_assert (symidx < symidxn);
-                 if (newsymidx[symidx] != symidx)
-                   {
-                     rel_mem.r_info
-                       = GELF_R_INFO (newsymidx[symidx],
-                                      GELF_R_TYPE (rel_mem.r_info));
+                   size_t symidx = GELF_R_SYM (rel_mem.r_info);
+                   elf_assert (symidx < symidxn);
+                   if (newsymidx[symidx] != symidx)
+                     {
+                       rel_mem.r_info
+                         = GELF_R_INFO (newsymidx[symidx],
+                                        GELF_R_TYPE (rel_mem.r_info));
 
-                     if (gelf_update_rela (d, relidx, &rel_mem) == 0)
-                       INTERNAL_ERROR (fname);
-                   }
-               }
+                       if (gelf_update_rela (d, relidx, &rel_mem) == 0)
+                         INTERNAL_ERROR (fname);
+                     }
+                 }
+             }
            break;
 
          case SHT_HASH:
-           if (no_symtab_updates ())
-             break;
-
            /* We have to recompute the hash table.  */
 
-           elf_assert (shdr_info[cnt].idx > 0);
+           elf_assert (info->idx > 0);
 
            /* The hash section in the new file.  */
-           scn = elf_getscn (newelf, shdr_info[cnt].idx);
+           scn = elf_getscn (newelf, info->idx);
 
            /* The symbol table data.  */
            Elf_Data *symd = elf_getdata (elf_getscn (newelf,
@@ -2278,7 +2271,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const 
char *fname,
            Elf_Data *hashd = elf_getdata (scn, NULL);
            elf_assert (hashd != NULL && hashd->d_buf != NULL);
 
-           if (shdr_info[cnt].shdr.sh_entsize == sizeof (Elf32_Word))
+           if (info->shdr.sh_entsize == sizeof (Elf32_Word))
              {
                /* Sane arches first.  */
                elf_assert (hashd->d_size >= 2 * sizeof (Elf32_Word));
@@ -2339,8 +2332,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const 
char *fname,
            else
              {
                /* Alpha and S390 64-bit use 64-bit SHT_HASH entries.  */
-               elf_assert (shdr_info[cnt].shdr.sh_entsize
-                           == sizeof (Elf64_Xword));
+               elf_assert (info->shdr.sh_entsize == sizeof (Elf64_Xword));
 
                Elf64_Xword *bucket = (Elf64_Xword *) hashd->d_buf;
 
@@ -2402,13 +2394,10 @@ handle_elf (int fd, Elf *elf, const char *prefix, const 
char *fname,
 
          case SHT_GNU_versym:
            /* If the symbol table changed we have to adjust the entries.  */
-           if (no_symtab_updates ())
-             break;
-
-           elf_assert (shdr_info[cnt].idx > 0);
+           elf_assert (info->idx > 0);
 
            /* The symbol version section in the new file.  */
-           scn = elf_getscn (newelf, shdr_info[cnt].idx);
+           scn = elf_getscn (newelf, info->idx);
 
            /* The symbol table data.  */
            symd = elf_getdata (elf_getscn (newelf, shdr_info[symtabidx].idx),
@@ -2444,12 +2433,9 @@ handle_elf (int fd, Elf *elf, const char *prefix, const 
char *fname,
            break;
 
          case SHT_GROUP:
-           if (no_symtab_updates ())
-             break;
-
            /* Yes, the symbol table changed.
               Update the section header of the section group.  */
-           scn = elf_getscn (newelf, shdr_info[cnt].idx);
+           scn = elf_getscn (newelf, info->idx);
            GElf_Shdr shdr_mem;
            GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
            elf_assert (shdr != NULL);
-- 
2.26.2

Reply via email to