mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-06 22:58:29 +00:00
perf symbols: Remove symbol_filter_t machinery
We're not using it anymore, few users were, but we really could do without it, simplify lots of functions by removing it. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/n/tip-1zng8wdznn00iiz08bb7q3vn@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
c79c809197
commit
be39db9f29
21 changed files with 141 additions and 202 deletions
|
@ -108,7 +108,7 @@ void arch__post_process_probe_trace_events(struct perf_probe_event *pev,
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
map = get_target_map(pev->target, pev->uprobes);
|
map = get_target_map(pev->target, pev->uprobes);
|
||||||
if (!map || map__load(map, NULL) < 0)
|
if (!map || map__load(map) < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = 0; i < ntevs; i++) {
|
for (i = 0; i < ntevs; i++) {
|
||||||
|
|
|
@ -429,7 +429,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
|
||||||
if (al.map != NULL) {
|
if (al.map != NULL) {
|
||||||
if (!al.map->dso->hit) {
|
if (!al.map->dso->hit) {
|
||||||
al.map->dso->hit = 1;
|
al.map->dso->hit = 1;
|
||||||
if (map__load(al.map, NULL) >= 0) {
|
if (map__load(al.map) >= 0) {
|
||||||
dso__inject_build_id(al.map->dso, tool, machine);
|
dso__inject_build_id(al.map->dso, tool, machine);
|
||||||
/*
|
/*
|
||||||
* If this fails, too bad, let the other side
|
* If this fails, too bad, let the other side
|
||||||
|
|
|
@ -330,7 +330,7 @@ static int build_alloc_func_list(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
kernel_map = machine__kernel_map(machine);
|
kernel_map = machine__kernel_map(machine);
|
||||||
if (map__load(kernel_map, NULL) < 0) {
|
if (map__load(kernel_map) < 0) {
|
||||||
pr_err("cannot load kernel map\n");
|
pr_err("cannot load kernel map\n");
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
@ -979,7 +979,7 @@ static void __print_slab_result(struct rb_root *root,
|
||||||
if (is_caller) {
|
if (is_caller) {
|
||||||
addr = data->call_site;
|
addr = data->call_site;
|
||||||
if (!raw_ip)
|
if (!raw_ip)
|
||||||
sym = machine__find_kernel_function(machine, addr, &map, NULL);
|
sym = machine__find_kernel_function(machine, addr, &map);
|
||||||
} else
|
} else
|
||||||
addr = data->ptr;
|
addr = data->ptr;
|
||||||
|
|
||||||
|
@ -1043,8 +1043,7 @@ static void __print_page_alloc_result(struct perf_session *session, int n_lines)
|
||||||
char *caller = buf;
|
char *caller = buf;
|
||||||
|
|
||||||
data = rb_entry(next, struct page_stat, node);
|
data = rb_entry(next, struct page_stat, node);
|
||||||
sym = machine__find_kernel_function(machine, data->callsite,
|
sym = machine__find_kernel_function(machine, data->callsite, &map);
|
||||||
&map, NULL);
|
|
||||||
if (sym && sym->name)
|
if (sym && sym->name)
|
||||||
caller = sym->name;
|
caller = sym->name;
|
||||||
else
|
else
|
||||||
|
@ -1086,8 +1085,7 @@ static void __print_page_caller_result(struct perf_session *session, int n_lines
|
||||||
char *caller = buf;
|
char *caller = buf;
|
||||||
|
|
||||||
data = rb_entry(next, struct page_stat, node);
|
data = rb_entry(next, struct page_stat, node);
|
||||||
sym = machine__find_kernel_function(machine, data->callsite,
|
sym = machine__find_kernel_function(machine, data->callsite, &map);
|
||||||
&map, NULL);
|
|
||||||
if (sym && sym->name)
|
if (sym && sym->name)
|
||||||
caller = sym->name;
|
caller = sym->name;
|
||||||
else
|
else
|
||||||
|
|
|
@ -522,11 +522,11 @@ static void print_sample_brstacksym(struct perf_sample *sample,
|
||||||
|
|
||||||
thread__find_addr_map(thread, sample->cpumode, MAP__FUNCTION, from, &alf);
|
thread__find_addr_map(thread, sample->cpumode, MAP__FUNCTION, from, &alf);
|
||||||
if (alf.map)
|
if (alf.map)
|
||||||
alf.sym = map__find_symbol(alf.map, alf.addr, NULL);
|
alf.sym = map__find_symbol(alf.map, alf.addr);
|
||||||
|
|
||||||
thread__find_addr_map(thread, sample->cpumode, MAP__FUNCTION, to, &alt);
|
thread__find_addr_map(thread, sample->cpumode, MAP__FUNCTION, to, &alt);
|
||||||
if (alt.map)
|
if (alt.map)
|
||||||
alt.sym = map__find_symbol(alt.map, alt.addr, NULL);
|
alt.sym = map__find_symbol(alt.map, alt.addr);
|
||||||
|
|
||||||
symbol__fprintf_symname_offs(alf.sym, &alf, stdout);
|
symbol__fprintf_symname_offs(alf.sym, &alf, stdout);
|
||||||
putchar('/');
|
putchar('/');
|
||||||
|
|
|
@ -263,7 +263,7 @@ static int read_object_code(u64 addr, size_t len, u8 cpumode,
|
||||||
* Converting addresses for use by objdump requires more information.
|
* Converting addresses for use by objdump requires more information.
|
||||||
* map__load() does that. See map__rip_2objdump() for details.
|
* map__load() does that. See map__rip_2objdump() for details.
|
||||||
*/
|
*/
|
||||||
if (map__load(al.map, NULL))
|
if (map__load(al.map))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* objdump struggles with kcore - try each map only once */
|
/* objdump struggles with kcore - try each map only once */
|
||||||
|
@ -511,7 +511,7 @@ static int do_test_code_reading(bool try_kcore)
|
||||||
|
|
||||||
/* Load kernel map */
|
/* Load kernel map */
|
||||||
map = machine__kernel_map(machine);
|
map = machine__kernel_map(machine);
|
||||||
ret = map__load(map, NULL);
|
ret = map__load(map);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
pr_debug("map__load failed\n");
|
pr_debug("map__load failed\n");
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
|
|
@ -54,7 +54,7 @@ int test__vmlinux_matches_kallsyms(int subtest __maybe_unused)
|
||||||
* be compacted against the list of modules found in the "vmlinux"
|
* be compacted against the list of modules found in the "vmlinux"
|
||||||
* code and with the one got from /proc/modules from the "kallsyms" code.
|
* code and with the one got from /proc/modules from the "kallsyms" code.
|
||||||
*/
|
*/
|
||||||
if (__machine__load_kallsyms(&kallsyms, "/proc/kallsyms", type, true, NULL) <= 0) {
|
if (__machine__load_kallsyms(&kallsyms, "/proc/kallsyms", type, true) <= 0) {
|
||||||
pr_debug("dso__load_kallsyms ");
|
pr_debug("dso__load_kallsyms ");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,7 @@ int test__vmlinux_matches_kallsyms(int subtest __maybe_unused)
|
||||||
* maps__reloc_vmlinux will notice and set proper ->[un]map_ip routines
|
* maps__reloc_vmlinux will notice and set proper ->[un]map_ip routines
|
||||||
* to fixup the symbols.
|
* to fixup the symbols.
|
||||||
*/
|
*/
|
||||||
if (machine__load_vmlinux_path(&vmlinux, type, NULL) <= 0) {
|
if (machine__load_vmlinux_path(&vmlinux, type) <= 0) {
|
||||||
pr_debug("Couldn't find a vmlinux that matches the kernel running on this machine, skipping test\n");
|
pr_debug("Couldn't find a vmlinux that matches the kernel running on this machine, skipping test\n");
|
||||||
err = TEST_SKIP;
|
err = TEST_SKIP;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -118,7 +118,7 @@ int test__vmlinux_matches_kallsyms(int subtest __maybe_unused)
|
||||||
mem_end = vmlinux_map->unmap_ip(vmlinux_map, sym->end);
|
mem_end = vmlinux_map->unmap_ip(vmlinux_map, sym->end);
|
||||||
|
|
||||||
first_pair = machine__find_kernel_symbol(&kallsyms, type,
|
first_pair = machine__find_kernel_symbol(&kallsyms, type,
|
||||||
mem_start, NULL, NULL);
|
mem_start, NULL);
|
||||||
pair = first_pair;
|
pair = first_pair;
|
||||||
|
|
||||||
if (pair && UM(pair->start) == mem_start) {
|
if (pair && UM(pair->start) == mem_start) {
|
||||||
|
@ -147,7 +147,7 @@ next_pair:
|
||||||
*/
|
*/
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
pair = machine__find_kernel_symbol_by_name(&kallsyms, type, sym->name, NULL, NULL);
|
pair = machine__find_kernel_symbol_by_name(&kallsyms, type, sym->name, NULL);
|
||||||
if (pair) {
|
if (pair) {
|
||||||
if (UM(pair->start) == mem_start)
|
if (UM(pair->start) == mem_start)
|
||||||
goto next_pair;
|
goto next_pair;
|
||||||
|
|
|
@ -495,7 +495,7 @@ static bool annotate_browser__callq(struct annotate_browser *browser,
|
||||||
if (!ins__is_call(dl->ins))
|
if (!ins__is_call(dl->ins))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (map_groups__find_ams(&target, NULL) ||
|
if (map_groups__find_ams(&target) ||
|
||||||
map__rip_2objdump(target.map, target.map->map_ip(target.map,
|
map__rip_2objdump(target.map, target.map->map_ip(target.map,
|
||||||
target.addr)) !=
|
target.addr)) !=
|
||||||
dl->ops.target.addr) {
|
dl->ops.target.addr) {
|
||||||
|
|
|
@ -52,9 +52,9 @@ static int map_browser__search(struct map_browser *browser)
|
||||||
|
|
||||||
if (target[0] == '0' && tolower(target[1]) == 'x') {
|
if (target[0] == '0' && tolower(target[1]) == 'x') {
|
||||||
u64 addr = strtoull(target, NULL, 16);
|
u64 addr = strtoull(target, NULL, 16);
|
||||||
sym = map__find_symbol(browser->map, addr, NULL);
|
sym = map__find_symbol(browser->map, addr);
|
||||||
} else
|
} else
|
||||||
sym = map__find_symbol_by_name(browser->map, target, NULL);
|
sym = map__find_symbol_by_name(browser->map, target);
|
||||||
|
|
||||||
if (sym != NULL) {
|
if (sym != NULL) {
|
||||||
u32 *idx = symbol__browser_index(sym);
|
u32 *idx = symbol__browser_index(sym);
|
||||||
|
|
|
@ -1077,7 +1077,7 @@ static int symbol__parse_objdump_line(struct symbol *sym, struct map *map,
|
||||||
.addr = dl->ops.target.addr,
|
.addr = dl->ops.target.addr,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!map_groups__find_ams(&target, NULL) &&
|
if (!map_groups__find_ams(&target) &&
|
||||||
target.sym->start == target.al_addr)
|
target.sym->start == target.al_addr)
|
||||||
dl->ops.target.name = strdup(target.sym->name);
|
dl->ops.target.name = strdup(target.sym->name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1286,7 +1286,7 @@ try_again:
|
||||||
* must be done prior to using kernel maps.
|
* must be done prior to using kernel maps.
|
||||||
*/
|
*/
|
||||||
if (load_map)
|
if (load_map)
|
||||||
map__load(al->map, NULL);
|
map__load(al->map);
|
||||||
al->addr = al->map->map_ip(al->map, al->addr);
|
al->addr = al->map->map_ip(al->map, al->addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1297,7 +1297,7 @@ void thread__find_addr_location(struct thread *thread,
|
||||||
{
|
{
|
||||||
thread__find_addr_map(thread, cpumode, type, addr, al);
|
thread__find_addr_map(thread, cpumode, type, addr, al);
|
||||||
if (al->map != NULL)
|
if (al->map != NULL)
|
||||||
al->sym = map__find_symbol(al->map, al->addr, NULL);
|
al->sym = map__find_symbol(al->map, al->addr);
|
||||||
else
|
else
|
||||||
al->sym = NULL;
|
al->sym = NULL;
|
||||||
}
|
}
|
||||||
|
@ -1358,7 +1358,7 @@ int machine__resolve(struct machine *machine, struct addr_location *al,
|
||||||
al->filtered |= (1 << HIST_FILTER__DSO);
|
al->filtered |= (1 << HIST_FILTER__DSO);
|
||||||
}
|
}
|
||||||
|
|
||||||
al->sym = map__find_symbol(al->map, al->addr, NULL);
|
al->sym = map__find_symbol(al->map, al->addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (symbol_conf.sym_list &&
|
if (symbol_conf.sym_list &&
|
||||||
|
@ -1414,5 +1414,5 @@ void thread__resolve(struct thread *thread, struct addr_location *al,
|
||||||
al->sym = NULL;
|
al->sym = NULL;
|
||||||
|
|
||||||
if (al->map)
|
if (al->map)
|
||||||
al->sym = map__find_symbol(al->map, al->addr, NULL);
|
al->sym = map__find_symbol(al->map, al->addr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -346,7 +346,7 @@ static int intel_bts_get_next_insn(struct intel_bts_queue *btsq, u64 ip)
|
||||||
goto out_put;
|
goto out_put;
|
||||||
|
|
||||||
/* Load maps to ensure dso->is_64_bit has been updated */
|
/* Load maps to ensure dso->is_64_bit has been updated */
|
||||||
map__load(al.map, NULL);
|
map__load(al.map);
|
||||||
|
|
||||||
x86_64 = al.map->dso->is_64_bit;
|
x86_64 = al.map->dso->is_64_bit;
|
||||||
|
|
||||||
|
|
|
@ -477,7 +477,7 @@ static int intel_pt_walk_next_insn(struct intel_pt_insn *intel_pt_insn,
|
||||||
start_ip = *ip;
|
start_ip = *ip;
|
||||||
|
|
||||||
/* Load maps to ensure dso->is_64_bit has been updated */
|
/* Load maps to ensure dso->is_64_bit has been updated */
|
||||||
map__load(al.map, NULL);
|
map__load(al.map);
|
||||||
|
|
||||||
x86_64 = al.map->dso->is_64_bit;
|
x86_64 = al.map->dso->is_64_bit;
|
||||||
|
|
||||||
|
@ -1294,7 +1294,7 @@ static u64 intel_pt_switch_ip(struct intel_pt *pt, u64 *ptss_ip)
|
||||||
if (!map)
|
if (!map)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (map__load(map, NULL))
|
if (map__load(map))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
start = dso__first_symbol(map->dso, MAP__FUNCTION);
|
start = dso__first_symbol(map->dso, MAP__FUNCTION);
|
||||||
|
|
|
@ -897,10 +897,10 @@ int machines__create_kernel_maps(struct machines *machines, pid_t pid)
|
||||||
}
|
}
|
||||||
|
|
||||||
int __machine__load_kallsyms(struct machine *machine, const char *filename,
|
int __machine__load_kallsyms(struct machine *machine, const char *filename,
|
||||||
enum map_type type, bool no_kcore, symbol_filter_t filter)
|
enum map_type type, bool no_kcore)
|
||||||
{
|
{
|
||||||
struct map *map = machine__kernel_map(machine);
|
struct map *map = machine__kernel_map(machine);
|
||||||
int ret = __dso__load_kallsyms(map->dso, filename, map, no_kcore, filter);
|
int ret = __dso__load_kallsyms(map->dso, filename, map, no_kcore);
|
||||||
|
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
dso__set_loaded(map->dso, type);
|
dso__set_loaded(map->dso, type);
|
||||||
|
@ -916,16 +916,15 @@ int __machine__load_kallsyms(struct machine *machine, const char *filename,
|
||||||
}
|
}
|
||||||
|
|
||||||
int machine__load_kallsyms(struct machine *machine, const char *filename,
|
int machine__load_kallsyms(struct machine *machine, const char *filename,
|
||||||
enum map_type type, symbol_filter_t filter)
|
enum map_type type)
|
||||||
{
|
{
|
||||||
return __machine__load_kallsyms(machine, filename, type, false, filter);
|
return __machine__load_kallsyms(machine, filename, type, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
int machine__load_vmlinux_path(struct machine *machine, enum map_type type,
|
int machine__load_vmlinux_path(struct machine *machine, enum map_type type)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
struct map *map = machine__kernel_map(machine);
|
struct map *map = machine__kernel_map(machine);
|
||||||
int ret = dso__load_vmlinux_path(map->dso, map, filter);
|
int ret = dso__load_vmlinux_path(map->dso, map);
|
||||||
|
|
||||||
if (ret > 0)
|
if (ret > 0)
|
||||||
dso__set_loaded(map->dso, type);
|
dso__set_loaded(map->dso, type);
|
||||||
|
@ -1294,7 +1293,7 @@ static int machine__process_kernel_mmap_event(struct machine *machine,
|
||||||
/*
|
/*
|
||||||
* preload dso of guest kernel and modules
|
* preload dso of guest kernel and modules
|
||||||
*/
|
*/
|
||||||
dso__load(kernel, machine__kernel_map(machine), NULL);
|
dso__load(kernel, machine__kernel_map(machine));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2096,7 +2095,7 @@ int machine__get_kernel_start(struct machine *machine)
|
||||||
*/
|
*/
|
||||||
machine->kernel_start = 1ULL << 63;
|
machine->kernel_start = 1ULL << 63;
|
||||||
if (map) {
|
if (map) {
|
||||||
err = map__load(map, NULL);
|
err = map__load(map);
|
||||||
if (map->start)
|
if (map->start)
|
||||||
machine->kernel_start = map->start;
|
machine->kernel_start = map->start;
|
||||||
}
|
}
|
||||||
|
@ -2112,7 +2111,7 @@ char *machine__resolve_kernel_addr(void *vmachine, unsigned long long *addrp, ch
|
||||||
{
|
{
|
||||||
struct machine *machine = vmachine;
|
struct machine *machine = vmachine;
|
||||||
struct map *map;
|
struct map *map;
|
||||||
struct symbol *sym = map_groups__find_symbol(&machine->kmaps, MAP__FUNCTION, *addrp, &map, NULL);
|
struct symbol *sym = map_groups__find_symbol(&machine->kmaps, MAP__FUNCTION, *addrp, &map);
|
||||||
|
|
||||||
if (sym == NULL)
|
if (sym == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -174,40 +174,33 @@ size_t machine__fprintf(struct machine *machine, FILE *fp);
|
||||||
static inline
|
static inline
|
||||||
struct symbol *machine__find_kernel_symbol(struct machine *machine,
|
struct symbol *machine__find_kernel_symbol(struct machine *machine,
|
||||||
enum map_type type, u64 addr,
|
enum map_type type, u64 addr,
|
||||||
struct map **mapp,
|
struct map **mapp)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
return map_groups__find_symbol(&machine->kmaps, type, addr,
|
return map_groups__find_symbol(&machine->kmaps, type, addr, mapp);
|
||||||
mapp, filter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
struct symbol *machine__find_kernel_symbol_by_name(struct machine *machine,
|
struct symbol *machine__find_kernel_symbol_by_name(struct machine *machine,
|
||||||
enum map_type type, const char *name,
|
enum map_type type, const char *name,
|
||||||
struct map **mapp,
|
struct map **mapp)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
return map_groups__find_symbol_by_name(&machine->kmaps, type, name,
|
return map_groups__find_symbol_by_name(&machine->kmaps, type, name, mapp);
|
||||||
mapp, filter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
struct symbol *machine__find_kernel_function(struct machine *machine, u64 addr,
|
struct symbol *machine__find_kernel_function(struct machine *machine, u64 addr,
|
||||||
struct map **mapp,
|
struct map **mapp)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
return machine__find_kernel_symbol(machine, MAP__FUNCTION, addr,
|
return machine__find_kernel_symbol(machine, MAP__FUNCTION, addr,
|
||||||
mapp, filter);
|
mapp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
struct symbol *machine__find_kernel_function_by_name(struct machine *machine,
|
struct symbol *machine__find_kernel_function_by_name(struct machine *machine,
|
||||||
const char *name,
|
const char *name,
|
||||||
struct map **mapp,
|
struct map **mapp)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
return map_groups__find_function_by_name(&machine->kmaps, name, mapp,
|
return map_groups__find_function_by_name(&machine->kmaps, name, mapp);
|
||||||
filter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct map *machine__findnew_module_map(struct machine *machine, u64 start,
|
struct map *machine__findnew_module_map(struct machine *machine, u64 start,
|
||||||
|
@ -215,11 +208,10 @@ struct map *machine__findnew_module_map(struct machine *machine, u64 start,
|
||||||
int arch__fix_module_text_start(u64 *start, const char *name);
|
int arch__fix_module_text_start(u64 *start, const char *name);
|
||||||
|
|
||||||
int __machine__load_kallsyms(struct machine *machine, const char *filename,
|
int __machine__load_kallsyms(struct machine *machine, const char *filename,
|
||||||
enum map_type type, bool no_kcore, symbol_filter_t filter);
|
enum map_type type, bool no_kcore);
|
||||||
int machine__load_kallsyms(struct machine *machine, const char *filename,
|
int machine__load_kallsyms(struct machine *machine, const char *filename,
|
||||||
enum map_type type, symbol_filter_t filter);
|
enum map_type type);
|
||||||
int machine__load_vmlinux_path(struct machine *machine, enum map_type type,
|
int machine__load_vmlinux_path(struct machine *machine, enum map_type type);
|
||||||
symbol_filter_t filter);
|
|
||||||
|
|
||||||
size_t machine__fprintf_dsos_buildid(struct machine *machine, FILE *fp,
|
size_t machine__fprintf_dsos_buildid(struct machine *machine, FILE *fp,
|
||||||
bool (skip)(struct dso *dso, int parm), int parm);
|
bool (skip)(struct dso *dso, int parm), int parm);
|
||||||
|
|
|
@ -279,7 +279,7 @@ void map__fixup_end(struct map *map)
|
||||||
|
|
||||||
#define DSO__DELETED "(deleted)"
|
#define DSO__DELETED "(deleted)"
|
||||||
|
|
||||||
int map__load(struct map *map, symbol_filter_t filter)
|
int map__load(struct map *map)
|
||||||
{
|
{
|
||||||
const char *name = map->dso->long_name;
|
const char *name = map->dso->long_name;
|
||||||
int nr;
|
int nr;
|
||||||
|
@ -287,7 +287,7 @@ int map__load(struct map *map, symbol_filter_t filter)
|
||||||
if (dso__loaded(map->dso, map->type))
|
if (dso__loaded(map->dso, map->type))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
nr = dso__load(map->dso, map, filter);
|
nr = dso__load(map->dso, map);
|
||||||
if (nr < 0) {
|
if (nr < 0) {
|
||||||
if (map->dso->has_build_id) {
|
if (map->dso->has_build_id) {
|
||||||
char sbuild_id[SBUILD_ID_SIZE];
|
char sbuild_id[SBUILD_ID_SIZE];
|
||||||
|
@ -312,9 +312,6 @@ int map__load(struct map *map, symbol_filter_t filter)
|
||||||
pr_warning("%.*s was updated (is prelink enabled?). "
|
pr_warning("%.*s was updated (is prelink enabled?). "
|
||||||
"Restart the long running apps that use it!\n",
|
"Restart the long running apps that use it!\n",
|
||||||
(int)real_len, name);
|
(int)real_len, name);
|
||||||
} else if (filter) {
|
|
||||||
pr_warning("no symbols passed the given filter.\n");
|
|
||||||
return -2; /* Empty but maybe by the filter */
|
|
||||||
} else {
|
} else {
|
||||||
pr_warning("no symbols found in %s, maybe install "
|
pr_warning("no symbols found in %s, maybe install "
|
||||||
"a debug package?\n", name);
|
"a debug package?\n", name);
|
||||||
|
@ -331,19 +328,17 @@ int __weak arch__compare_symbol_names(const char *namea, const char *nameb)
|
||||||
return strcmp(namea, nameb);
|
return strcmp(namea, nameb);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct symbol *map__find_symbol(struct map *map, u64 addr,
|
struct symbol *map__find_symbol(struct map *map, u64 addr)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
if (map__load(map, filter) < 0)
|
if (map__load(map) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return dso__find_symbol(map->dso, map->type, addr);
|
return dso__find_symbol(map->dso, map->type, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct symbol *map__find_symbol_by_name(struct map *map, const char *name,
|
struct symbol *map__find_symbol_by_name(struct map *map, const char *name)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
if (map__load(map, filter) < 0)
|
if (map__load(map) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!dso__sorted_by_name(map->dso, map->type))
|
if (!dso__sorted_by_name(map->dso, map->type))
|
||||||
|
@ -556,23 +551,22 @@ void map_groups__put(struct map_groups *mg)
|
||||||
|
|
||||||
struct symbol *map_groups__find_symbol(struct map_groups *mg,
|
struct symbol *map_groups__find_symbol(struct map_groups *mg,
|
||||||
enum map_type type, u64 addr,
|
enum map_type type, u64 addr,
|
||||||
struct map **mapp,
|
struct map **mapp)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
struct map *map = map_groups__find(mg, type, addr);
|
struct map *map = map_groups__find(mg, type, addr);
|
||||||
|
|
||||||
/* Ensure map is loaded before using map->map_ip */
|
/* Ensure map is loaded before using map->map_ip */
|
||||||
if (map != NULL && map__load(map, filter) >= 0) {
|
if (map != NULL && map__load(map) >= 0) {
|
||||||
if (mapp != NULL)
|
if (mapp != NULL)
|
||||||
*mapp = map;
|
*mapp = map;
|
||||||
return map__find_symbol(map, map->map_ip(map, addr), filter);
|
return map__find_symbol(map, map->map_ip(map, addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name,
|
struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name,
|
||||||
struct map **mapp, symbol_filter_t filter)
|
struct map **mapp)
|
||||||
{
|
{
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
struct rb_node *nd;
|
struct rb_node *nd;
|
||||||
|
@ -582,7 +576,7 @@ struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name,
|
||||||
for (nd = rb_first(&maps->entries); nd; nd = rb_next(nd)) {
|
for (nd = rb_first(&maps->entries); nd; nd = rb_next(nd)) {
|
||||||
struct map *pos = rb_entry(nd, struct map, rb_node);
|
struct map *pos = rb_entry(nd, struct map, rb_node);
|
||||||
|
|
||||||
sym = map__find_symbol_by_name(pos, name, filter);
|
sym = map__find_symbol_by_name(pos, name);
|
||||||
|
|
||||||
if (sym == NULL)
|
if (sym == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
@ -600,15 +594,14 @@ out:
|
||||||
struct symbol *map_groups__find_symbol_by_name(struct map_groups *mg,
|
struct symbol *map_groups__find_symbol_by_name(struct map_groups *mg,
|
||||||
enum map_type type,
|
enum map_type type,
|
||||||
const char *name,
|
const char *name,
|
||||||
struct map **mapp,
|
struct map **mapp)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
struct symbol *sym = maps__find_symbol_by_name(&mg->maps[type], name, mapp, filter);
|
struct symbol *sym = maps__find_symbol_by_name(&mg->maps[type], name, mapp);
|
||||||
|
|
||||||
return sym;
|
return sym;
|
||||||
}
|
}
|
||||||
|
|
||||||
int map_groups__find_ams(struct addr_map_symbol *ams, symbol_filter_t filter)
|
int map_groups__find_ams(struct addr_map_symbol *ams)
|
||||||
{
|
{
|
||||||
if (ams->addr < ams->map->start || ams->addr >= ams->map->end) {
|
if (ams->addr < ams->map->start || ams->addr >= ams->map->end) {
|
||||||
if (ams->map->groups == NULL)
|
if (ams->map->groups == NULL)
|
||||||
|
@ -620,7 +613,7 @@ int map_groups__find_ams(struct addr_map_symbol *ams, symbol_filter_t filter)
|
||||||
}
|
}
|
||||||
|
|
||||||
ams->al_addr = ams->map->map_ip(ams->map, ams->addr);
|
ams->al_addr = ams->map->map_ip(ams->map, ams->addr);
|
||||||
ams->sym = map__find_symbol(ams->map, ams->al_addr, filter);
|
ams->sym = map__find_symbol(ams->map, ams->al_addr);
|
||||||
|
|
||||||
return ams->sym ? 0 : -1;
|
return ams->sym ? 0 : -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,17 +127,14 @@ struct thread;
|
||||||
* @map: the 'struct map *' in which symbols itereated
|
* @map: the 'struct map *' in which symbols itereated
|
||||||
* @sym_name: the symbol name
|
* @sym_name: the symbol name
|
||||||
* @pos: the 'struct symbol *' to use as a loop cursor
|
* @pos: the 'struct symbol *' to use as a loop cursor
|
||||||
* @filter: to use when loading the DSO
|
|
||||||
*/
|
*/
|
||||||
#define __map__for_each_symbol_by_name(map, sym_name, pos, filter) \
|
#define __map__for_each_symbol_by_name(map, sym_name, pos) \
|
||||||
for (pos = map__find_symbol_by_name(map, sym_name, filter); \
|
for (pos = map__find_symbol_by_name(map, sym_name); \
|
||||||
pos && arch__compare_symbol_names(pos->name, sym_name) == 0; \
|
pos && arch__compare_symbol_names(pos->name, sym_name) == 0; \
|
||||||
pos = symbol__next_by_name(pos))
|
pos = symbol__next_by_name(pos))
|
||||||
|
|
||||||
#define map__for_each_symbol_by_name(map, sym_name, pos) \
|
#define map__for_each_symbol_by_name(map, sym_name, pos) \
|
||||||
__map__for_each_symbol_by_name(map, sym_name, (pos), NULL)
|
__map__for_each_symbol_by_name(map, sym_name, (pos))
|
||||||
|
|
||||||
typedef int (*symbol_filter_t)(struct map *map, struct symbol *sym);
|
|
||||||
|
|
||||||
int arch__compare_symbol_names(const char *namea, const char *nameb);
|
int arch__compare_symbol_names(const char *namea, const char *nameb);
|
||||||
void map__init(struct map *map, enum map_type type,
|
void map__init(struct map *map, enum map_type type,
|
||||||
|
@ -173,11 +170,9 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp);
|
||||||
int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix,
|
int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix,
|
||||||
FILE *fp);
|
FILE *fp);
|
||||||
|
|
||||||
int map__load(struct map *map, symbol_filter_t filter);
|
int map__load(struct map *map);
|
||||||
struct symbol *map__find_symbol(struct map *map,
|
struct symbol *map__find_symbol(struct map *map, u64 addr);
|
||||||
u64 addr, symbol_filter_t filter);
|
struct symbol *map__find_symbol_by_name(struct map *map, const char *name);
|
||||||
struct symbol *map__find_symbol_by_name(struct map *map, const char *name,
|
|
||||||
symbol_filter_t filter);
|
|
||||||
void map__fixup_start(struct map *map);
|
void map__fixup_start(struct map *map);
|
||||||
void map__fixup_end(struct map *map);
|
void map__fixup_end(struct map *map);
|
||||||
|
|
||||||
|
@ -191,7 +186,7 @@ struct map *maps__find(struct maps *maps, u64 addr);
|
||||||
struct map *maps__first(struct maps *maps);
|
struct map *maps__first(struct maps *maps);
|
||||||
struct map *map__next(struct map *map);
|
struct map *map__next(struct map *map);
|
||||||
struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name,
|
struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name,
|
||||||
struct map **mapp, symbol_filter_t filter);
|
struct map **mapp);
|
||||||
void map_groups__init(struct map_groups *mg, struct machine *machine);
|
void map_groups__init(struct map_groups *mg, struct machine *machine);
|
||||||
void map_groups__exit(struct map_groups *mg);
|
void map_groups__exit(struct map_groups *mg);
|
||||||
int map_groups__clone(struct thread *thread,
|
int map_groups__clone(struct thread *thread,
|
||||||
|
@ -231,25 +226,22 @@ static inline struct map *map_groups__next(struct map *map)
|
||||||
|
|
||||||
struct symbol *map_groups__find_symbol(struct map_groups *mg,
|
struct symbol *map_groups__find_symbol(struct map_groups *mg,
|
||||||
enum map_type type, u64 addr,
|
enum map_type type, u64 addr,
|
||||||
struct map **mapp,
|
struct map **mapp);
|
||||||
symbol_filter_t filter);
|
|
||||||
|
|
||||||
struct symbol *map_groups__find_symbol_by_name(struct map_groups *mg,
|
struct symbol *map_groups__find_symbol_by_name(struct map_groups *mg,
|
||||||
enum map_type type,
|
enum map_type type,
|
||||||
const char *name,
|
const char *name,
|
||||||
struct map **mapp,
|
struct map **mapp);
|
||||||
symbol_filter_t filter);
|
|
||||||
|
|
||||||
struct addr_map_symbol;
|
struct addr_map_symbol;
|
||||||
|
|
||||||
int map_groups__find_ams(struct addr_map_symbol *ams, symbol_filter_t filter);
|
int map_groups__find_ams(struct addr_map_symbol *ams);
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
struct symbol *map_groups__find_function_by_name(struct map_groups *mg,
|
struct symbol *map_groups__find_function_by_name(struct map_groups *mg,
|
||||||
const char *name, struct map **mapp,
|
const char *name, struct map **mapp)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
return map_groups__find_symbol_by_name(mg, MAP__FUNCTION, name, mapp, filter);
|
return map_groups__find_symbol_by_name(mg, MAP__FUNCTION, name, mapp);
|
||||||
}
|
}
|
||||||
|
|
||||||
int map_groups__fixup_overlappings(struct map_groups *mg, struct map *map,
|
int map_groups__fixup_overlappings(struct map_groups *mg, struct map *map,
|
||||||
|
|
|
@ -110,13 +110,12 @@ void exit_probe_symbol_maps(void)
|
||||||
static struct symbol *__find_kernel_function_by_name(const char *name,
|
static struct symbol *__find_kernel_function_by_name(const char *name,
|
||||||
struct map **mapp)
|
struct map **mapp)
|
||||||
{
|
{
|
||||||
return machine__find_kernel_function_by_name(host_machine, name, mapp,
|
return machine__find_kernel_function_by_name(host_machine, name, mapp);
|
||||||
NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct symbol *__find_kernel_function(u64 addr, struct map **mapp)
|
static struct symbol *__find_kernel_function(u64 addr, struct map **mapp)
|
||||||
{
|
{
|
||||||
return machine__find_kernel_function(host_machine, addr, mapp, NULL);
|
return machine__find_kernel_function(host_machine, addr, mapp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ref_reloc_sym *kernel_get_ref_reloc_sym(void)
|
static struct ref_reloc_sym *kernel_get_ref_reloc_sym(void)
|
||||||
|
@ -125,7 +124,7 @@ static struct ref_reloc_sym *kernel_get_ref_reloc_sym(void)
|
||||||
struct kmap *kmap;
|
struct kmap *kmap;
|
||||||
struct map *map = machine__kernel_map(host_machine);
|
struct map *map = machine__kernel_map(host_machine);
|
||||||
|
|
||||||
if (map__load(map, NULL) < 0)
|
if (map__load(map) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
kmap = map__kmap(map);
|
kmap = map__kmap(map);
|
||||||
|
@ -351,9 +350,9 @@ static int kernel_get_module_dso(const char *module, struct dso **pdso)
|
||||||
vmlinux_name = symbol_conf.vmlinux_name;
|
vmlinux_name = symbol_conf.vmlinux_name;
|
||||||
dso->load_errno = 0;
|
dso->load_errno = 0;
|
||||||
if (vmlinux_name)
|
if (vmlinux_name)
|
||||||
ret = dso__load_vmlinux(dso, map, vmlinux_name, false, NULL);
|
ret = dso__load_vmlinux(dso, map, vmlinux_name, false);
|
||||||
else
|
else
|
||||||
ret = dso__load_vmlinux_path(dso, map, NULL);
|
ret = dso__load_vmlinux_path(dso, map);
|
||||||
found:
|
found:
|
||||||
*pdso = dso;
|
*pdso = dso;
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1999,7 +1998,7 @@ static int find_perf_probe_point_from_map(struct probe_trace_point *tp,
|
||||||
map = dso__new_map(tp->module);
|
map = dso__new_map(tp->module);
|
||||||
if (!map)
|
if (!map)
|
||||||
goto out;
|
goto out;
|
||||||
sym = map__find_symbol(map, addr, NULL);
|
sym = map__find_symbol(map, addr);
|
||||||
} else {
|
} else {
|
||||||
if (tp->symbol && !addr) {
|
if (tp->symbol && !addr) {
|
||||||
if (kernel_get_symbol_address_by_name(tp->symbol,
|
if (kernel_get_symbol_address_by_name(tp->symbol,
|
||||||
|
@ -2704,7 +2703,7 @@ static int find_probe_functions(struct map *map, char *name,
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
struct rb_node *tmp;
|
struct rb_node *tmp;
|
||||||
|
|
||||||
if (map__load(map, NULL) < 0)
|
if (map__load(map) < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
map__for_each_symbol(map, sym, tmp) {
|
map__for_each_symbol(map, sym, tmp) {
|
||||||
|
@ -3368,7 +3367,7 @@ int show_available_funcs(const char *target, struct strfilter *_filter,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = map__load(map, NULL);
|
ret = map__load(map);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (ret == -2) {
|
if (ret == -2) {
|
||||||
char *str = strfilter__string(_filter);
|
char *str = strfilter__string(_filter);
|
||||||
|
|
|
@ -254,8 +254,7 @@ static char *demangle_sym(struct dso *dso, int kmodule, const char *elf_name)
|
||||||
* And always look at the original dso, not at debuginfo packages, that
|
* And always look at the original dso, not at debuginfo packages, that
|
||||||
* have the PLT data stripped out (shdr_rel_plt.sh_type == SHT_NOBITS).
|
* have the PLT data stripped out (shdr_rel_plt.sh_type == SHT_NOBITS).
|
||||||
*/
|
*/
|
||||||
int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *map,
|
int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *map)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
uint32_t nr_rel_entries, idx;
|
uint32_t nr_rel_entries, idx;
|
||||||
GElf_Sym sym;
|
GElf_Sym sym;
|
||||||
|
@ -351,12 +350,8 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *
|
||||||
if (!f)
|
if (!f)
|
||||||
goto out_elf_end;
|
goto out_elf_end;
|
||||||
|
|
||||||
if (filter && filter(map, f))
|
symbols__insert(&dso->symbols[map->type], f);
|
||||||
symbol__delete(f);
|
++nr;
|
||||||
else {
|
|
||||||
symbols__insert(&dso->symbols[map->type], f);
|
|
||||||
++nr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else if (shdr_rel_plt.sh_type == SHT_REL) {
|
} else if (shdr_rel_plt.sh_type == SHT_REL) {
|
||||||
GElf_Rel pos_mem, *pos;
|
GElf_Rel pos_mem, *pos;
|
||||||
|
@ -381,12 +376,8 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *
|
||||||
if (!f)
|
if (!f)
|
||||||
goto out_elf_end;
|
goto out_elf_end;
|
||||||
|
|
||||||
if (filter && filter(map, f))
|
symbols__insert(&dso->symbols[map->type], f);
|
||||||
symbol__delete(f);
|
++nr;
|
||||||
else {
|
|
||||||
symbols__insert(&dso->symbols[map->type], f);
|
|
||||||
++nr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -825,9 +816,8 @@ static u64 ref_reloc(struct kmap *kmap)
|
||||||
void __weak arch__sym_update(struct symbol *s __maybe_unused,
|
void __weak arch__sym_update(struct symbol *s __maybe_unused,
|
||||||
GElf_Sym *sym __maybe_unused) { }
|
GElf_Sym *sym __maybe_unused) { }
|
||||||
|
|
||||||
int dso__load_sym(struct dso *dso, struct map *map,
|
int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss,
|
||||||
struct symsrc *syms_ss, struct symsrc *runtime_ss,
|
struct symsrc *runtime_ss, int kmodule)
|
||||||
symbol_filter_t filter, int kmodule)
|
|
||||||
{
|
{
|
||||||
struct kmap *kmap = dso->kernel ? map__kmap(map) : NULL;
|
struct kmap *kmap = dso->kernel ? map__kmap(map) : NULL;
|
||||||
struct map_groups *kmaps = kmap ? map__kmaps(map) : NULL;
|
struct map_groups *kmaps = kmap ? map__kmaps(map) : NULL;
|
||||||
|
@ -1124,12 +1114,8 @@ new_symbol:
|
||||||
|
|
||||||
arch__sym_update(f, &sym);
|
arch__sym_update(f, &sym);
|
||||||
|
|
||||||
if (filter && filter(curr_map, f))
|
__symbols__insert(&curr_dso->symbols[curr_map->type], f, dso->kernel);
|
||||||
symbol__delete(f);
|
nr++;
|
||||||
else {
|
|
||||||
__symbols__insert(&curr_dso->symbols[curr_map->type], f, dso->kernel);
|
|
||||||
nr++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -287,8 +287,7 @@ void symsrc__destroy(struct symsrc *ss)
|
||||||
|
|
||||||
int dso__synthesize_plt_symbols(struct dso *dso __maybe_unused,
|
int dso__synthesize_plt_symbols(struct dso *dso __maybe_unused,
|
||||||
struct symsrc *ss __maybe_unused,
|
struct symsrc *ss __maybe_unused,
|
||||||
struct map *map __maybe_unused,
|
struct map *map __maybe_unused)
|
||||||
symbol_filter_t filter __maybe_unused)
|
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -334,7 +333,6 @@ enum dso_type dso__type_fd(int fd)
|
||||||
int dso__load_sym(struct dso *dso, struct map *map __maybe_unused,
|
int dso__load_sym(struct dso *dso, struct map *map __maybe_unused,
|
||||||
struct symsrc *ss,
|
struct symsrc *ss,
|
||||||
struct symsrc *runtime_ss __maybe_unused,
|
struct symsrc *runtime_ss __maybe_unused,
|
||||||
symbol_filter_t filter __maybe_unused,
|
|
||||||
int kmodule __maybe_unused)
|
int kmodule __maybe_unused)
|
||||||
{
|
{
|
||||||
unsigned char build_id[BUILD_ID_SIZE];
|
unsigned char build_id[BUILD_ID_SIZE];
|
||||||
|
|
|
@ -24,10 +24,8 @@
|
||||||
#include <symbol/kallsyms.h>
|
#include <symbol/kallsyms.h>
|
||||||
#include <sys/utsname.h>
|
#include <sys/utsname.h>
|
||||||
|
|
||||||
static int dso__load_kernel_sym(struct dso *dso, struct map *map,
|
static int dso__load_kernel_sym(struct dso *dso, struct map *map);
|
||||||
symbol_filter_t filter);
|
static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map);
|
||||||
static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map,
|
|
||||||
symbol_filter_t filter);
|
|
||||||
static bool symbol__is_idle(const char *name);
|
static bool symbol__is_idle(const char *name);
|
||||||
|
|
||||||
int vmlinux_path__nr_entries;
|
int vmlinux_path__nr_entries;
|
||||||
|
@ -630,8 +628,7 @@ static int dso__load_all_kallsyms(struct dso *dso, const char *filename,
|
||||||
return kallsyms__parse(filename, &args, map__process_kallsym_symbol);
|
return kallsyms__parse(filename, &args, map__process_kallsym_symbol);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dso__split_kallsyms_for_kcore(struct dso *dso, struct map *map,
|
static int dso__split_kallsyms_for_kcore(struct dso *dso, struct map *map)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
struct map_groups *kmaps = map__kmaps(map);
|
struct map_groups *kmaps = map__kmaps(map);
|
||||||
struct map *curr_map;
|
struct map *curr_map;
|
||||||
|
@ -660,7 +657,7 @@ static int dso__split_kallsyms_for_kcore(struct dso *dso, struct map *map,
|
||||||
|
|
||||||
curr_map = map_groups__find(kmaps, map->type, pos->start);
|
curr_map = map_groups__find(kmaps, map->type, pos->start);
|
||||||
|
|
||||||
if (!curr_map || (filter && filter(curr_map, pos))) {
|
if (!curr_map) {
|
||||||
symbol__delete(pos);
|
symbol__delete(pos);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -683,8 +680,7 @@ static int dso__split_kallsyms_for_kcore(struct dso *dso, struct map *map,
|
||||||
* kernel range is broken in several maps, named [kernel].N, as we don't have
|
* kernel range is broken in several maps, named [kernel].N, as we don't have
|
||||||
* the original ELF section names vmlinux have.
|
* the original ELF section names vmlinux have.
|
||||||
*/
|
*/
|
||||||
static int dso__split_kallsyms(struct dso *dso, struct map *map, u64 delta,
|
static int dso__split_kallsyms(struct dso *dso, struct map *map, u64 delta)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
struct map_groups *kmaps = map__kmaps(map);
|
struct map_groups *kmaps = map__kmaps(map);
|
||||||
struct machine *machine;
|
struct machine *machine;
|
||||||
|
@ -761,7 +757,7 @@ static int dso__split_kallsyms(struct dso *dso, struct map *map, u64 delta,
|
||||||
|
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
curr_map = map;
|
curr_map = map;
|
||||||
goto filter_symbol;
|
goto add_symbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
|
if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
|
||||||
|
@ -793,18 +789,18 @@ static int dso__split_kallsyms(struct dso *dso, struct map *map, u64 delta,
|
||||||
pos->start -= delta;
|
pos->start -= delta;
|
||||||
pos->end -= delta;
|
pos->end -= delta;
|
||||||
}
|
}
|
||||||
filter_symbol:
|
add_symbol:
|
||||||
if (filter && filter(curr_map, pos)) {
|
if (curr_map != map) {
|
||||||
discard_symbol: rb_erase(&pos->rb_node, root);
|
rb_erase(&pos->rb_node, root);
|
||||||
symbol__delete(pos);
|
symbols__insert(&curr_map->dso->symbols[curr_map->type], pos);
|
||||||
} else {
|
++moved;
|
||||||
if (curr_map != map) {
|
} else
|
||||||
rb_erase(&pos->rb_node, root);
|
++count;
|
||||||
symbols__insert(&curr_map->dso->symbols[curr_map->type], pos);
|
|
||||||
++moved;
|
continue;
|
||||||
} else
|
discard_symbol:
|
||||||
++count;
|
rb_erase(&pos->rb_node, root);
|
||||||
}
|
symbol__delete(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (curr_map != map &&
|
if (curr_map != map &&
|
||||||
|
@ -1244,7 +1240,7 @@ static int kallsyms__delta(struct map *map, const char *filename, u64 *delta)
|
||||||
}
|
}
|
||||||
|
|
||||||
int __dso__load_kallsyms(struct dso *dso, const char *filename,
|
int __dso__load_kallsyms(struct dso *dso, const char *filename,
|
||||||
struct map *map, bool no_kcore, symbol_filter_t filter)
|
struct map *map, bool no_kcore)
|
||||||
{
|
{
|
||||||
u64 delta = 0;
|
u64 delta = 0;
|
||||||
|
|
||||||
|
@ -1266,19 +1262,18 @@ int __dso__load_kallsyms(struct dso *dso, const char *filename,
|
||||||
dso->symtab_type = DSO_BINARY_TYPE__KALLSYMS;
|
dso->symtab_type = DSO_BINARY_TYPE__KALLSYMS;
|
||||||
|
|
||||||
if (!no_kcore && !dso__load_kcore(dso, map, filename))
|
if (!no_kcore && !dso__load_kcore(dso, map, filename))
|
||||||
return dso__split_kallsyms_for_kcore(dso, map, filter);
|
return dso__split_kallsyms_for_kcore(dso, map);
|
||||||
else
|
else
|
||||||
return dso__split_kallsyms(dso, map, delta, filter);
|
return dso__split_kallsyms(dso, map, delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
int dso__load_kallsyms(struct dso *dso, const char *filename,
|
int dso__load_kallsyms(struct dso *dso, const char *filename,
|
||||||
struct map *map, symbol_filter_t filter)
|
struct map *map)
|
||||||
{
|
{
|
||||||
return __dso__load_kallsyms(dso, filename, map, false, filter);
|
return __dso__load_kallsyms(dso, filename, map, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dso__load_perf_map(struct dso *dso, struct map *map,
|
static int dso__load_perf_map(struct dso *dso, struct map *map)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
char *line = NULL;
|
char *line = NULL;
|
||||||
size_t n;
|
size_t n;
|
||||||
|
@ -1320,12 +1315,8 @@ static int dso__load_perf_map(struct dso *dso, struct map *map,
|
||||||
if (sym == NULL)
|
if (sym == NULL)
|
||||||
goto out_delete_line;
|
goto out_delete_line;
|
||||||
|
|
||||||
if (filter && filter(map, sym))
|
symbols__insert(&dso->symbols[map->type], sym);
|
||||||
symbol__delete(sym);
|
nr_syms++;
|
||||||
else {
|
|
||||||
symbols__insert(&dso->symbols[map->type], sym);
|
|
||||||
nr_syms++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free(line);
|
free(line);
|
||||||
|
@ -1381,7 +1372,7 @@ static bool dso__is_compatible_symtab_type(struct dso *dso, bool kmod,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter)
|
int dso__load(struct dso *dso, struct map *map)
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
@ -1404,9 +1395,9 @@ int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter)
|
||||||
|
|
||||||
if (dso->kernel) {
|
if (dso->kernel) {
|
||||||
if (dso->kernel == DSO_TYPE_KERNEL)
|
if (dso->kernel == DSO_TYPE_KERNEL)
|
||||||
ret = dso__load_kernel_sym(dso, map, filter);
|
ret = dso__load_kernel_sym(dso, map);
|
||||||
else if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
|
else if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
|
||||||
ret = dso__load_guest_kernel_sym(dso, map, filter);
|
ret = dso__load_guest_kernel_sym(dso, map);
|
||||||
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -1430,7 +1421,7 @@ int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = dso__load_perf_map(dso, map, filter);
|
ret = dso__load_perf_map(dso, map);
|
||||||
dso->symtab_type = ret > 0 ? DSO_BINARY_TYPE__JAVA_JIT :
|
dso->symtab_type = ret > 0 ? DSO_BINARY_TYPE__JAVA_JIT :
|
||||||
DSO_BINARY_TYPE__NOT_FOUND;
|
DSO_BINARY_TYPE__NOT_FOUND;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1521,14 +1512,14 @@ int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter)
|
||||||
kmod = true;
|
kmod = true;
|
||||||
|
|
||||||
if (syms_ss)
|
if (syms_ss)
|
||||||
ret = dso__load_sym(dso, map, syms_ss, runtime_ss, filter, kmod);
|
ret = dso__load_sym(dso, map, syms_ss, runtime_ss, kmod);
|
||||||
else
|
else
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
int nr_plt;
|
int nr_plt;
|
||||||
|
|
||||||
nr_plt = dso__synthesize_plt_symbols(dso, runtime_ss, map, filter);
|
nr_plt = dso__synthesize_plt_symbols(dso, runtime_ss, map);
|
||||||
if (nr_plt > 0)
|
if (nr_plt > 0)
|
||||||
ret += nr_plt;
|
ret += nr_plt;
|
||||||
}
|
}
|
||||||
|
@ -1567,8 +1558,7 @@ out_unlock:
|
||||||
}
|
}
|
||||||
|
|
||||||
int dso__load_vmlinux(struct dso *dso, struct map *map,
|
int dso__load_vmlinux(struct dso *dso, struct map *map,
|
||||||
const char *vmlinux, bool vmlinux_allocated,
|
const char *vmlinux, bool vmlinux_allocated)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
int err = -1;
|
int err = -1;
|
||||||
struct symsrc ss;
|
struct symsrc ss;
|
||||||
|
@ -1588,7 +1578,7 @@ int dso__load_vmlinux(struct dso *dso, struct map *map,
|
||||||
if (symsrc__init(&ss, dso, symfs_vmlinux, symtab_type))
|
if (symsrc__init(&ss, dso, symfs_vmlinux, symtab_type))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
err = dso__load_sym(dso, map, &ss, &ss, filter, 0);
|
err = dso__load_sym(dso, map, &ss, &ss, 0);
|
||||||
symsrc__destroy(&ss);
|
symsrc__destroy(&ss);
|
||||||
|
|
||||||
if (err > 0) {
|
if (err > 0) {
|
||||||
|
@ -1604,8 +1594,7 @@ int dso__load_vmlinux(struct dso *dso, struct map *map,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dso__load_vmlinux_path(struct dso *dso, struct map *map,
|
int dso__load_vmlinux_path(struct dso *dso, struct map *map)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
int i, err = 0;
|
int i, err = 0;
|
||||||
char *filename = NULL;
|
char *filename = NULL;
|
||||||
|
@ -1614,7 +1603,7 @@ int dso__load_vmlinux_path(struct dso *dso, struct map *map,
|
||||||
vmlinux_path__nr_entries + 1);
|
vmlinux_path__nr_entries + 1);
|
||||||
|
|
||||||
for (i = 0; i < vmlinux_path__nr_entries; ++i) {
|
for (i = 0; i < vmlinux_path__nr_entries; ++i) {
|
||||||
err = dso__load_vmlinux(dso, map, vmlinux_path[i], false, filter);
|
err = dso__load_vmlinux(dso, map, vmlinux_path[i], false);
|
||||||
if (err > 0)
|
if (err > 0)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -1622,7 +1611,7 @@ int dso__load_vmlinux_path(struct dso *dso, struct map *map,
|
||||||
if (!symbol_conf.ignore_vmlinux_buildid)
|
if (!symbol_conf.ignore_vmlinux_buildid)
|
||||||
filename = dso__build_id_filename(dso, NULL, 0);
|
filename = dso__build_id_filename(dso, NULL, 0);
|
||||||
if (filename != NULL) {
|
if (filename != NULL) {
|
||||||
err = dso__load_vmlinux(dso, map, filename, true, filter);
|
err = dso__load_vmlinux(dso, map, filename, true);
|
||||||
if (err > 0)
|
if (err > 0)
|
||||||
goto out;
|
goto out;
|
||||||
free(filename);
|
free(filename);
|
||||||
|
@ -1736,8 +1725,7 @@ proc_kallsyms:
|
||||||
return strdup(path);
|
return strdup(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dso__load_kernel_sym(struct dso *dso, struct map *map,
|
static int dso__load_kernel_sym(struct dso *dso, struct map *map)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
const char *kallsyms_filename = NULL;
|
const char *kallsyms_filename = NULL;
|
||||||
|
@ -1763,12 +1751,11 @@ static int dso__load_kernel_sym(struct dso *dso, struct map *map,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!symbol_conf.ignore_vmlinux && symbol_conf.vmlinux_name != NULL) {
|
if (!symbol_conf.ignore_vmlinux && symbol_conf.vmlinux_name != NULL) {
|
||||||
return dso__load_vmlinux(dso, map, symbol_conf.vmlinux_name,
|
return dso__load_vmlinux(dso, map, symbol_conf.vmlinux_name, false);
|
||||||
false, filter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!symbol_conf.ignore_vmlinux && vmlinux_path != NULL) {
|
if (!symbol_conf.ignore_vmlinux && vmlinux_path != NULL) {
|
||||||
err = dso__load_vmlinux_path(dso, map, filter);
|
err = dso__load_vmlinux_path(dso, map);
|
||||||
if (err > 0)
|
if (err > 0)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -1784,7 +1771,7 @@ static int dso__load_kernel_sym(struct dso *dso, struct map *map,
|
||||||
kallsyms_filename = kallsyms_allocated_filename;
|
kallsyms_filename = kallsyms_allocated_filename;
|
||||||
|
|
||||||
do_kallsyms:
|
do_kallsyms:
|
||||||
err = dso__load_kallsyms(dso, kallsyms_filename, map, filter);
|
err = dso__load_kallsyms(dso, kallsyms_filename, map);
|
||||||
if (err > 0)
|
if (err > 0)
|
||||||
pr_debug("Using %s for symbols\n", kallsyms_filename);
|
pr_debug("Using %s for symbols\n", kallsyms_filename);
|
||||||
free(kallsyms_allocated_filename);
|
free(kallsyms_allocated_filename);
|
||||||
|
@ -1799,8 +1786,7 @@ do_kallsyms:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map,
|
static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map)
|
||||||
symbol_filter_t filter)
|
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
const char *kallsyms_filename = NULL;
|
const char *kallsyms_filename = NULL;
|
||||||
|
@ -1822,7 +1808,7 @@ static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map,
|
||||||
if (symbol_conf.default_guest_vmlinux_name != NULL) {
|
if (symbol_conf.default_guest_vmlinux_name != NULL) {
|
||||||
err = dso__load_vmlinux(dso, map,
|
err = dso__load_vmlinux(dso, map,
|
||||||
symbol_conf.default_guest_vmlinux_name,
|
symbol_conf.default_guest_vmlinux_name,
|
||||||
false, filter);
|
false);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1834,7 +1820,7 @@ static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map,
|
||||||
kallsyms_filename = path;
|
kallsyms_filename = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = dso__load_kallsyms(dso, kallsyms_filename, map, filter);
|
err = dso__load_kallsyms(dso, kallsyms_filename, map);
|
||||||
if (err > 0)
|
if (err > 0)
|
||||||
pr_debug("Using %s for symbols\n", kallsyms_filename);
|
pr_debug("Using %s for symbols\n", kallsyms_filename);
|
||||||
if (err > 0 && !dso__is_kcore(dso)) {
|
if (err > 0 && !dso__is_kcore(dso)) {
|
||||||
|
|
|
@ -241,16 +241,13 @@ int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name,
|
||||||
bool symsrc__has_symtab(struct symsrc *ss);
|
bool symsrc__has_symtab(struct symsrc *ss);
|
||||||
bool symsrc__possibly_runtime(struct symsrc *ss);
|
bool symsrc__possibly_runtime(struct symsrc *ss);
|
||||||
|
|
||||||
int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter);
|
int dso__load(struct dso *dso, struct map *map);
|
||||||
int dso__load_vmlinux(struct dso *dso, struct map *map,
|
int dso__load_vmlinux(struct dso *dso, struct map *map,
|
||||||
const char *vmlinux, bool vmlinux_allocated,
|
const char *vmlinux, bool vmlinux_allocated);
|
||||||
symbol_filter_t filter);
|
int dso__load_vmlinux_path(struct dso *dso, struct map *map);
|
||||||
int dso__load_vmlinux_path(struct dso *dso, struct map *map,
|
|
||||||
symbol_filter_t filter);
|
|
||||||
int __dso__load_kallsyms(struct dso *dso, const char *filename, struct map *map,
|
int __dso__load_kallsyms(struct dso *dso, const char *filename, struct map *map,
|
||||||
bool no_kcore, symbol_filter_t filter);
|
bool no_kcore);
|
||||||
int dso__load_kallsyms(struct dso *dso, const char *filename, struct map *map,
|
int dso__load_kallsyms(struct dso *dso, const char *filename, struct map *map);
|
||||||
symbol_filter_t filter);
|
|
||||||
|
|
||||||
void dso__insert_symbol(struct dso *dso, enum map_type type,
|
void dso__insert_symbol(struct dso *dso, enum map_type type,
|
||||||
struct symbol *sym);
|
struct symbol *sym);
|
||||||
|
@ -298,10 +295,9 @@ int symbol__config_symfs(const struct option *opt __maybe_unused,
|
||||||
const char *dir, int unset __maybe_unused);
|
const char *dir, int unset __maybe_unused);
|
||||||
|
|
||||||
int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss,
|
int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss,
|
||||||
struct symsrc *runtime_ss, symbol_filter_t filter,
|
struct symsrc *runtime_ss, int kmodule);
|
||||||
int kmodule);
|
|
||||||
int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss,
|
int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss,
|
||||||
struct map *map, symbol_filter_t filter);
|
struct map *map);
|
||||||
|
|
||||||
void __symbols__insert(struct rb_root *symbols, struct symbol *sym, bool kernel);
|
void __symbols__insert(struct rb_root *symbols, struct symbol *sym, bool kernel);
|
||||||
void symbols__insert(struct rb_root *symbols, struct symbol *sym);
|
void symbols__insert(struct rb_root *symbols, struct symbol *sym);
|
||||||
|
|
Loading…
Add table
Reference in a new issue