From: Steven Rostedt <rost...@goodmis.org>

In order to remove the double #include of sorttable.h for 64 and 32 bit
to create duplicate functions, add helper functions for Elf_Ehdr.  This
will create a function pointer for each helper that will get assigned to
the appropriate function to handle either the 64bit or 32bit version.

This also moves the _r()/r() wrappers for the Elf_Ehdr references that
handle endian and size differences between the different architectures,
into the helper function and out of the open code which is more error
prone.

Signed-off-by: Steven Rostedt (Google) <rost...@goodmis.org>
---
 scripts/sorttable.c | 25 +++++++++++++++++++++++++
 scripts/sorttable.h | 20 ++++++++++++++++----
 2 files changed, 41 insertions(+), 4 deletions(-)

diff --git a/scripts/sorttable.c b/scripts/sorttable.c
index 57792cf2aa89..5dfa734eff09 100644
--- a/scripts/sorttable.c
+++ b/scripts/sorttable.c
@@ -85,6 +85,31 @@ static uint64_t (*r8)(const uint64_t *);
 static void (*w)(uint32_t, uint32_t *);
 typedef void (*table_sort_t)(char *, int);
 
+static uint64_t ehdr64_shoff(Elf_Ehdr *ehdr)
+{
+       return r8(&ehdr->e64.e_shoff);
+}
+
+static uint64_t ehdr32_shoff(Elf_Ehdr *ehdr)
+{
+       return r(&ehdr->e32.e_shoff);
+}
+
+#define EHDR_HALF(fn_name)                             \
+static uint16_t ehdr64_##fn_name(Elf_Ehdr *ehdr)       \
+{                                                      \
+       return r2(&ehdr->e64.e_##fn_name);              \
+}                                                      \
+                                                       \
+static uint16_t ehdr32_##fn_name(Elf_Ehdr *ehdr)       \
+{                                                      \
+       return r2(&ehdr->e32.e_##fn_name);              \
+}
+
+EHDR_HALF(shentsize)
+EHDR_HALF(shstrndx)
+EHDR_HALF(shnum)
+
 /*
  * Get the whole file as a programming convenience in order to avoid
  * malloc+lseek+read+free of many pieces.  If successful, then mmap
diff --git a/scripts/sorttable.h b/scripts/sorttable.h
index a365a8bc405a..3855f2ad0e73 100644
--- a/scripts/sorttable.h
+++ b/scripts/sorttable.h
@@ -27,6 +27,10 @@
 #undef uint_t
 #undef _r
 #undef etype
+#undef ehdr_shoff
+#undef ehdr_shentsize
+#undef ehdr_shstrndx
+#undef ehdr_shnum
 
 #ifdef SORTTABLE_64
 # define extable_ent_size      16
@@ -39,6 +43,10 @@
 # define uint_t                        uint64_t
 # define _r                    r8
 # define etype                 e64
+# define ehdr_shoff            ehdr64_shoff
+# define ehdr_shentsize                ehdr64_shentsize
+# define ehdr_shstrndx         ehdr64_shstrndx
+# define ehdr_shnum            ehdr64_shnum
 #else
 # define extable_ent_size      8
 # define compare_extable       compare_extable_32
@@ -50,6 +58,10 @@
 # define uint_t                        uint32_t
 # define _r                    r
 # define etype                 e32
+# define ehdr_shoff            ehdr32_shoff
+# define ehdr_shentsize                ehdr32_shentsize
+# define ehdr_shstrndx         ehdr32_shstrndx
+# define ehdr_shnum            ehdr32_shnum
 #endif
 
 #if defined(SORTTABLE_64) && defined(UNWINDER_ORC_ENABLED)
@@ -247,16 +259,16 @@ static int do_sort(Elf_Ehdr *ehdr,
        unsigned int orc_num_entries = 0;
 #endif
 
-       shdr_start = (Elf_Shdr *)((char *)ehdr + _r(&ehdr->etype.e_shoff));
-       shentsize = r2(&ehdr->etype.e_shentsize);
+       shdr_start = (Elf_Shdr *)((char *)ehdr + ehdr_shoff(ehdr));
+       shentsize = ehdr_shentsize(ehdr);
 
-       shstrndx = r2(&ehdr->etype.e_shstrndx);
+       shstrndx = ehdr_shstrndx(ehdr);
        if (shstrndx == SHN_XINDEX)
                shstrndx = r(&shdr_start->etype.sh_link);
        string_sec = get_index(shdr_start, shentsize, shstrndx);
        secstrings = (const char *)ehdr + _r(&string_sec->etype.sh_offset);
 
-       shnum = r2(&ehdr->etype.e_shnum);
+       shnum = ehdr_shnum(ehdr);
        if (shnum == SHN_UNDEF)
                shnum = _r(&shdr_start->etype.sh_size);
 
-- 
2.45.2



Reply via email to