perf symbols: Introduce ELF counterparts to symbol_type__is_a
authorArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 11 Dec 2009 16:50:38 +0000 (14:50 -0200)
committerIngo Molnar <mingo@elte.hu>
Sat, 12 Dec 2009 06:42:10 +0000 (07:42 +0100)
For selecting the right types of symbols in ELF symtabs.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1260550239-5372-3-git-send-email-acme@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
tools/perf/util/symbol.c

index bb21c96e8e1593650fa106c1201e5b2dd1cf958a..db8dc97b548bd4f565cfedef3f0e01505839172e 100644 (file)
@@ -751,6 +751,26 @@ out:
        return 0;
 }
 
+static bool elf_sym__is_a(GElf_Sym *self, enum map_type type)
+{
+       switch (type) {
+       case MAP__FUNCTION:
+               return elf_sym__is_function(self);
+       default:
+               return false;
+       }
+}
+
+static bool elf_sec__is_a(GElf_Shdr *self, Elf_Data *secstrs, enum map_type type)
+{
+       switch (type) {
+       case MAP__FUNCTION:
+               return elf_sec__is_text(self, secstrs);
+       default:
+               return false;
+       }
+}
+
 static int dso__load_sym(struct dso *self, struct map *map,
                         struct map_groups *mg, const char *name, int fd,
                         symbol_filter_t filter, int kernel, int kmodule)
@@ -825,7 +845,7 @@ static int dso__load_sym(struct dso *self, struct map *map,
                int is_label = elf_sym__is_label(&sym);
                const char *section_name;
 
-               if (!is_label && !elf_sym__is_function(&sym))
+               if (!is_label && !elf_sym__is_a(&sym, map->type))
                        continue;
 
                sec = elf_getscn(elf, sym.st_shndx);
@@ -834,7 +854,7 @@ static int dso__load_sym(struct dso *self, struct map *map,
 
                gelf_getshdr(sec, &shdr);
 
-               if (is_label && !elf_sec__is_text(&shdr, secstrs))
+               if (is_label && !elf_sec__is_a(&shdr, secstrs, map->type))
                        continue;
 
                elf_name = elf_sym__name(&sym, symstrs);