ftrace/recordmcount: Add helper function get_sym_str_and_relp()
Steven Rostedt [Thu, 21 Apr 2011 01:13:06 +0000 (21:13 -0400)]
The code to get the symbol, string, and relp pointers in the two functions
sift_rel_mcount() and nop_mcount() are identical and also non-trivial.
Moving this duplicate code into a single helper function makes the code
easier to read and more maintainable.

Cc: John Reiser <jreiser@bitwagon.com>
Link: http://lkml.kernel.org/r/20110421023739.723658553@goodmis.org
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

scripts/recordmcount.h

index deb6a51..3c00fab 100644 (file)
@@ -29,6 +29,7 @@
 #undef has_rel_mcount
 #undef tot_relsize
 #undef get_mcountsym
+#undef get_sym_str_and_relp
 #undef do_func
 #undef Elf_Addr
 #undef Elf_Ehdr
@@ -56,6 +57,7 @@
 # define __has_rel_mcount      __has64_rel_mcount
 # define has_rel_mcount                has64_rel_mcount
 # define tot_relsize           tot64_relsize
+# define get_sym_str_and_relp  get_sym_str_and_relp_64
 # define do_func               do64
 # define get_mcountsym         get_mcountsym_64
 # define is_fake_mcount                is_fake_mcount64
@@ -86,6 +88,7 @@
 # define __has_rel_mcount      __has32_rel_mcount
 # define has_rel_mcount                has32_rel_mcount
 # define tot_relsize           tot32_relsize
+# define get_sym_str_and_relp  get_sym_str_and_relp_32
 # define do_func               do32
 # define get_mcountsym         get_mcountsym_32
 # define is_fake_mcount                is_fake_mcount32
@@ -260,6 +263,29 @@ static unsigned get_mcountsym(Elf_Sym const *const sym0,
        return mcountsym;
 }
 
+static void get_sym_str_and_relp(Elf_Shdr const *const relhdr,
+                                Elf_Ehdr const *const ehdr,
+                                Elf_Sym const **sym0,
+                                char const **str0,
+                                Elf_Rel const **relp)
+{
+       Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w(ehdr->e_shoff)
+               + (void *)ehdr);
+       unsigned const symsec_sh_link = w(relhdr->sh_link);
+       Elf_Shdr const *const symsec = &shdr0[symsec_sh_link];
+       Elf_Shdr const *const strsec = &shdr0[w(symsec->sh_link)];
+       Elf_Rel const *const rel0 = (Elf_Rel const *)(_w(relhdr->sh_offset)
+               + (void *)ehdr);
+
+       *sym0 = (Elf_Sym const *)(_w(symsec->sh_offset)
+                                 + (void *)ehdr);
+
+       *str0 = (char const *)(_w(strsec->sh_offset)
+                              + (void *)ehdr);
+
+       *relp = rel0;
+}
+
 /*
  * Look at the relocations in order to find the calls to mcount.
  * Accumulate the section offsets that are found, and their relocation info,
@@ -276,26 +302,16 @@ static uint_t *sift_rel_mcount(uint_t *mlocp,
 {
        uint_t *const mloc0 = mlocp;
        Elf_Rel *mrelp = *mrelpp;
-       Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w(ehdr->e_shoff)
-               + (void *)ehdr);
-       unsigned const symsec_sh_link = w(relhdr->sh_link);
-       Elf_Shdr const *const symsec = &shdr0[symsec_sh_link];
-       Elf_Sym const *const sym0 = (Elf_Sym const *)(_w(symsec->sh_offset)
-               + (void *)ehdr);
-
-       Elf_Shdr const *const strsec = &shdr0[w(symsec->sh_link)];
-       char const *const str0 = (char const *)(_w(strsec->sh_offset)
-               + (void *)ehdr);
-
-       Elf_Rel const *const rel0 = (Elf_Rel const *)(_w(relhdr->sh_offset)
-               + (void *)ehdr);
+       Elf_Sym const *sym0;
+       char const *str0;
+       Elf_Rel const *relp;
        unsigned rel_entsize = _w(relhdr->sh_entsize);
        unsigned const nrel = _w(relhdr->sh_size) / rel_entsize;
-       Elf_Rel const *relp = rel0;
-
        unsigned mcountsym = 0;
        unsigned t;
 
+       get_sym_str_and_relp(relhdr, ehdr, &sym0, &str0, &relp);
+
        for (t = nrel; t; --t) {
                if (!mcountsym)
                        mcountsym = get_mcountsym(sym0, relp, str0);
@@ -331,27 +347,18 @@ static void nop_mcount(Elf_Shdr const *const relhdr,
 {
        Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w(ehdr->e_shoff)
                + (void *)ehdr);
-       unsigned const symsec_sh_link = w(relhdr->sh_link);
-       Elf_Shdr const *const symsec = &shdr0[symsec_sh_link];
-       Elf_Sym const *const sym0 = (Elf_Sym const *)(_w(symsec->sh_offset)
-               + (void *)ehdr);
-
-       Elf_Shdr const *const strsec = &shdr0[w(symsec->sh_link)];
-       char const *const str0 = (char const *)(_w(strsec->sh_offset)
-               + (void *)ehdr);
-
-       Elf_Rel const *const rel0 = (Elf_Rel const *)(_w(relhdr->sh_offset)
-               + (void *)ehdr);
+       Elf_Sym const *sym0;
+       char const *str0;
+       Elf_Rel const *relp;
+       Elf_Shdr const *const shdr = &shdr0[w(relhdr->sh_info)];
        unsigned rel_entsize = _w(relhdr->sh_entsize);
        unsigned const nrel = _w(relhdr->sh_size) / rel_entsize;
-       Elf_Rel const *relp = rel0;
-
-       Elf_Shdr const *const shdr = &shdr0[w(relhdr->sh_info)];
-
        unsigned mcountsym = 0;
        unsigned t;
        int once = 0;
 
+       get_sym_str_and_relp(relhdr, ehdr, &sym0, &str0, &relp);
+
        for (t = nrel; t; --t) {
                int ret = -1;