]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - tools/perf/util/build-id.c
Merge tag 'stable/for-linus-3.14-rc5-tag' of git://git.kernel.org/pub/scm/linux/kerne...
[mirror_ubuntu-artful-kernel.git] / tools / perf / util / build-id.c
CommitLineData
7b2567c1
ACM
1/*
2 * build-id.c
3 *
4 * build-id support
5 *
6 * Copyright (C) 2009, 2010 Red Hat Inc.
7 * Copyright (C) 2009, 2010 Arnaldo Carvalho de Melo <acme@redhat.com>
8 */
b36f19d5
ACM
9#include "util.h"
10#include <stdio.h>
7b2567c1
ACM
11#include "build-id.h"
12#include "event.h"
13#include "symbol.h"
14#include <linux/kernel.h>
591765fd 15#include "debug.h"
d20deb64 16#include "session.h"
45694aa7 17#include "tool.h"
7b2567c1 18
54a3cf59
AV
19int build_id__mark_dso_hit(struct perf_tool *tool __maybe_unused,
20 union perf_event *event,
ef89325f 21 struct perf_sample *sample,
54a3cf59
AV
22 struct perf_evsel *evsel __maybe_unused,
23 struct machine *machine)
7b2567c1
ACM
24{
25 struct addr_location al;
26 u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
ef89325f
AH
27 struct thread *thread = machine__findnew_thread(machine, sample->pid,
28 sample->pid);
7b2567c1
ACM
29
30 if (thread == NULL) {
31 pr_err("problem processing %d event, skipping it.\n",
32 event->header.type);
33 return -1;
34 }
35
743eb868 36 thread__find_addr_map(thread, machine, cpumode, MAP__FUNCTION,
ef89325f 37 sample->ip, &al);
7b2567c1
ACM
38
39 if (al.map != NULL)
40 al.map->dso->hit = 1;
41
42 return 0;
43}
44
1d037ca1 45static int perf_event__exit_del_thread(struct perf_tool *tool __maybe_unused,
d20deb64 46 union perf_event *event,
1d037ca1
IT
47 struct perf_sample *sample
48 __maybe_unused,
743eb868 49 struct machine *machine)
591765fd 50{
314add6b
AH
51 struct thread *thread = machine__findnew_thread(machine,
52 event->fork.pid,
53 event->fork.tid);
591765fd 54
8115d60c
ACM
55 dump_printf("(%d:%d):(%d:%d)\n", event->fork.pid, event->fork.tid,
56 event->fork.ppid, event->fork.ptid);
591765fd
ACM
57
58 if (thread) {
743eb868
ACM
59 rb_erase(&thread->rb_node, &machine->threads);
60 machine->last_match = NULL;
591765fd
ACM
61 thread__delete(thread);
62 }
63
64 return 0;
65}
66
45694aa7 67struct perf_tool build_id__mark_dso_hit_ops = {
7b2567c1 68 .sample = build_id__mark_dso_hit,
8115d60c 69 .mmap = perf_event__process_mmap,
5c5e854b 70 .mmap2 = perf_event__process_mmap2,
f62d3f0f 71 .fork = perf_event__process_fork,
8115d60c 72 .exit = perf_event__exit_del_thread,
299c3452
SE
73 .attr = perf_event__process_attr,
74 .build_id = perf_event__process_build_id,
7b2567c1 75};
b36f19d5 76
ebb296c2
JO
77int build_id__sprintf(const u8 *build_id, int len, char *bf)
78{
79 char *bid = bf;
80 const u8 *raw = build_id;
81 int i;
82
83 for (i = 0; i < len; ++i) {
84 sprintf(bid, "%02x", *raw);
85 ++raw;
86 bid += 2;
87 }
88
89 return raw - build_id;
90}
91
3344996e 92char *dso__build_id_filename(const struct dso *dso, char *bf, size_t size)
b36f19d5
ACM
93{
94 char build_id_hex[BUILD_ID_SIZE * 2 + 1];
b36f19d5 95
c824c433 96 if (!dso->has_build_id)
b36f19d5
ACM
97 return NULL;
98
c824c433 99 build_id__sprintf(dso->build_id, sizeof(dso->build_id), build_id_hex);
b36f19d5 100 if (bf == NULL) {
45de34bb
SE
101 if (asprintf(&bf, "%s/.build-id/%.2s/%s", buildid_dir,
102 build_id_hex, build_id_hex + 2) < 0)
b36f19d5
ACM
103 return NULL;
104 } else
45de34bb
SE
105 snprintf(bf, size, "%s/.build-id/%.2s/%s", buildid_dir,
106 build_id_hex, build_id_hex + 2);
b36f19d5
ACM
107 return bf;
108}