Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 245501
b: refs/heads/master
c: dfad3d5
h: refs/heads/master
i:
  245499: b6de353
v: v3
  • Loading branch information
Steven Rostedt authored and Steven Rostedt committed May 16, 2011
1 parent 450fae1 commit 4701336
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ffd618fa39284f8cc343894b566dd42ec6e74e77
refs/heads/master: dfad3d598c4bbbaf137588e22bac1ce624529f7e
32 changes: 24 additions & 8 deletions trunk/scripts/recordmcount.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <getopt.h>
#include <elf.h>
#include <fcntl.h>
#include <setjmp.h>
Expand All @@ -39,6 +40,7 @@ static char gpfx; /* prefix for global symbol name (sometimes '_') */
static struct stat sb; /* Remember .st_size, etc. */
static jmp_buf jmpenv; /* setjmp/longjmp per-file error escape */
static const char *altmcount; /* alternate mcount symbol name */
static int warn_on_notrace_sect; /* warn when section has mcount not being recorded */

/* setjmp() return values */
enum {
Expand Down Expand Up @@ -397,19 +399,33 @@ do_file(char const *const fname)
}

int
main(int argc, char const *argv[])
main(int argc, char *argv[])
{
const char ftrace[] = "/ftrace.o";
int ftrace_size = sizeof(ftrace) - 1;
int n_error = 0; /* gcc-4.3.0 false positive complaint */
int c;
int i;

if (argc <= 1) {
fprintf(stderr, "usage: recordmcount file.o...\n");
while ((c = getopt(argc, argv, "w")) >= 0) {
switch (c) {
case 'w':
warn_on_notrace_sect = 1;
break;
default:
fprintf(stderr, "usage: recordmcount [-w] file.o...\n");
return 0;
}
}

if ((argc - optind) < 1) {
fprintf(stderr, "usage: recordmcount [-w] file.o...\n");
return 0;
}

/* Process each file in turn, allowing deep failure. */
for (--argc, ++argv; argc > 0; --argc, ++argv) {
for (i = optind; i < argc; i++) {
char *file = argv[i];
int const sjval = setjmp(jmpenv);
int len;

Expand All @@ -418,22 +434,22 @@ main(int argc, char const *argv[])
* function but does not call it. Since ftrace.o should
* not be traced anyway, we just skip it.
*/
len = strlen(argv[0]);
len = strlen(file);
if (len >= ftrace_size &&
strcmp(argv[0] + (len - ftrace_size), ftrace) == 0)
strcmp(file + (len - ftrace_size), ftrace) == 0)
continue;

switch (sjval) {
default:
fprintf(stderr, "internal error: %s\n", argv[0]);
fprintf(stderr, "internal error: %s\n", file);
exit(1);
break;
case SJ_SETJMP: /* normal sequence */
/* Avoid problems if early cleanup() */
fd_map = -1;
ehdr_curr = NULL;
mmap_failed = 1;
do_file(argv[0]);
do_file(file);
break;
case SJ_FAIL: /* error in do_file or below */
++n_error;
Expand Down
22 changes: 17 additions & 5 deletions trunk/scripts/recordmcount.h
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,8 @@ static uint_t *sift_rel_mcount(uint_t *mlocp,
* into nops.
*/
static void nop_mcount(Elf_Shdr const *const relhdr,
Elf_Ehdr const *const ehdr)
Elf_Ehdr const *const ehdr,
const char *const txtname)
{
Elf_Shdr *const shdr0 = (Elf_Shdr *)(_w(ehdr->e_shoff)
+ (void *)ehdr);
Expand All @@ -336,6 +337,7 @@ static void nop_mcount(Elf_Shdr const *const relhdr,

unsigned mcountsym = 0;
unsigned t;
int once = 0;

for (t = nrel; t; --t) {
int ret = -1;
Expand All @@ -353,8 +355,18 @@ static void nop_mcount(Elf_Shdr const *const relhdr,
mcountsym = Elf_r_sym(relp);
}

if (mcountsym == Elf_r_sym(relp) && !is_fake_mcount(relp))
ret = make_nop((void *)ehdr, shdr->sh_offset + relp->r_offset);
if (mcountsym == Elf_r_sym(relp) && !is_fake_mcount(relp)) {
if (make_nop)
ret = make_nop((void *)ehdr, shdr->sh_offset + relp->r_offset);
if (warn_on_notrace_sect && !once) {
printf("Section %s has mcount callers being ignored\n",
txtname);
once = 1;
/* just warn? */
if (!make_nop)
return;
}
}

/*
* If we successfully removed the mcount, mark the relocation
Expand Down Expand Up @@ -501,12 +513,12 @@ do_func(Elf_Ehdr *const ehdr, char const *const fname, unsigned const reltype)
mlocp = sift_rel_mcount(mlocp,
(void *)mlocp - (void *)mloc0, &mrelp,
relhdr, ehdr, recsym, recval, reltype);
} else if (make_nop && txtname) {
} else if (txtname && (warn_on_notrace_sect || make_nop)) {
/*
* This section is ignored by ftrace, but still
* has mcount calls. Convert them to nops now.
*/
nop_mcount(relhdr, ehdr);
nop_mcount(relhdr, ehdr, txtname);
}
}
if (mloc0 != mlocp) {
Expand Down

0 comments on commit 4701336

Please sign in to comment.