ftrace/recordmcount: Add helper function get_sym_str_and_relp()
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>
This commit is contained in:
parent
37762cb997
commit
41b402a201
1 changed files with 37 additions and 30 deletions
|
@ -29,6 +29,7 @@
|
||||||
#undef has_rel_mcount
|
#undef has_rel_mcount
|
||||||
#undef tot_relsize
|
#undef tot_relsize
|
||||||
#undef get_mcountsym
|
#undef get_mcountsym
|
||||||
|
#undef get_sym_str_and_relp
|
||||||
#undef do_func
|
#undef do_func
|
||||||
#undef Elf_Addr
|
#undef Elf_Addr
|
||||||
#undef Elf_Ehdr
|
#undef Elf_Ehdr
|
||||||
|
@ -56,6 +57,7 @@
|
||||||
# define __has_rel_mcount __has64_rel_mcount
|
# define __has_rel_mcount __has64_rel_mcount
|
||||||
# define has_rel_mcount has64_rel_mcount
|
# define has_rel_mcount has64_rel_mcount
|
||||||
# define tot_relsize tot64_relsize
|
# define tot_relsize tot64_relsize
|
||||||
|
# define get_sym_str_and_relp get_sym_str_and_relp_64
|
||||||
# define do_func do64
|
# define do_func do64
|
||||||
# define get_mcountsym get_mcountsym_64
|
# define get_mcountsym get_mcountsym_64
|
||||||
# define is_fake_mcount is_fake_mcount64
|
# 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 has_rel_mcount has32_rel_mcount
|
# define has_rel_mcount has32_rel_mcount
|
||||||
# define tot_relsize tot32_relsize
|
# define tot_relsize tot32_relsize
|
||||||
|
# define get_sym_str_and_relp get_sym_str_and_relp_32
|
||||||
# define do_func do32
|
# define do_func do32
|
||||||
# define get_mcountsym get_mcountsym_32
|
# define get_mcountsym get_mcountsym_32
|
||||||
# define is_fake_mcount is_fake_mcount32
|
# define is_fake_mcount is_fake_mcount32
|
||||||
|
@ -260,6 +263,29 @@ static unsigned get_mcountsym(Elf_Sym const *const sym0,
|
||||||
return mcountsym;
|
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.
|
* Look at the relocations in order to find the calls to mcount.
|
||||||
* Accumulate the section offsets that are found, and their relocation info,
|
* 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;
|
uint_t *const mloc0 = mlocp;
|
||||||
Elf_Rel *mrelp = *mrelpp;
|
Elf_Rel *mrelp = *mrelpp;
|
||||||
Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w(ehdr->e_shoff)
|
Elf_Sym const *sym0;
|
||||||
+ (void *)ehdr);
|
char const *str0;
|
||||||
unsigned const symsec_sh_link = w(relhdr->sh_link);
|
Elf_Rel const *relp;
|
||||||
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);
|
|
||||||
unsigned rel_entsize = _w(relhdr->sh_entsize);
|
unsigned rel_entsize = _w(relhdr->sh_entsize);
|
||||||
unsigned const nrel = _w(relhdr->sh_size) / rel_entsize;
|
unsigned const nrel = _w(relhdr->sh_size) / rel_entsize;
|
||||||
Elf_Rel const *relp = rel0;
|
|
||||||
|
|
||||||
unsigned mcountsym = 0;
|
unsigned mcountsym = 0;
|
||||||
unsigned t;
|
unsigned t;
|
||||||
|
|
||||||
|
get_sym_str_and_relp(relhdr, ehdr, &sym0, &str0, &relp);
|
||||||
|
|
||||||
for (t = nrel; t; --t) {
|
for (t = nrel; t; --t) {
|
||||||
if (!mcountsym)
|
if (!mcountsym)
|
||||||
mcountsym = get_mcountsym(sym0, relp, str0);
|
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)
|
Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w(ehdr->e_shoff)
|
||||||
+ (void *)ehdr);
|
+ (void *)ehdr);
|
||||||
unsigned const symsec_sh_link = w(relhdr->sh_link);
|
Elf_Sym const *sym0;
|
||||||
Elf_Shdr const *const symsec = &shdr0[symsec_sh_link];
|
char const *str0;
|
||||||
Elf_Sym const *const sym0 = (Elf_Sym const *)(_w(symsec->sh_offset)
|
Elf_Rel const *relp;
|
||||||
+ (void *)ehdr);
|
Elf_Shdr const *const shdr = &shdr0[w(relhdr->sh_info)];
|
||||||
|
|
||||||
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);
|
|
||||||
unsigned rel_entsize = _w(relhdr->sh_entsize);
|
unsigned rel_entsize = _w(relhdr->sh_entsize);
|
||||||
unsigned const nrel = _w(relhdr->sh_size) / rel_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 mcountsym = 0;
|
||||||
unsigned t;
|
unsigned t;
|
||||||
int once = 0;
|
int once = 0;
|
||||||
|
|
||||||
|
get_sym_str_and_relp(relhdr, ehdr, &sym0, &str0, &relp);
|
||||||
|
|
||||||
for (t = nrel; t; --t) {
|
for (t = nrel; t; --t) {
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue