6 * Copyright (C) 2009, 2010 Red Hat Inc.
7 * Copyright (C) 2009, 2010 Arnaldo Carvalho de Melo <acme@redhat.com>
14 #include <linux/kernel.h>
17 static int build_id__mark_dso_hit(union perf_event
*event
,
18 struct perf_sample
*sample __used
,
19 struct perf_evsel
*evsel __used
,
20 struct perf_session
*session
)
22 struct addr_location al
;
23 u8 cpumode
= event
->header
.misc
& PERF_RECORD_MISC_CPUMODE_MASK
;
24 struct thread
*thread
= perf_session__findnew(session
, event
->ip
.pid
);
27 pr_err("problem processing %d event, skipping it.\n",
32 thread__find_addr_map(thread
, session
, cpumode
, MAP__FUNCTION
,
33 event
->ip
.pid
, event
->ip
.ip
, &al
);
41 static int perf_event__exit_del_thread(union perf_event
*event
,
42 struct perf_sample
*sample __used
,
43 struct perf_session
*session
)
45 struct thread
*thread
= perf_session__findnew(session
, event
->fork
.tid
);
47 dump_printf("(%d:%d):(%d:%d)\n", event
->fork
.pid
, event
->fork
.tid
,
48 event
->fork
.ppid
, event
->fork
.ptid
);
51 rb_erase(&thread
->rb_node
, &session
->threads
);
52 session
->last_match
= NULL
;
53 thread__delete(thread
);
59 struct perf_event_ops build_id__mark_dso_hit_ops
= {
60 .sample
= build_id__mark_dso_hit
,
61 .mmap
= perf_event__process_mmap
,
62 .fork
= perf_event__process_task
,
63 .exit
= perf_event__exit_del_thread
,
66 char *dso__build_id_filename(struct dso
*self
, char *bf
, size_t size
)
68 char build_id_hex
[BUILD_ID_SIZE
* 2 + 1];
70 if (!self
->has_build_id
)
73 build_id__sprintf(self
->build_id
, sizeof(self
->build_id
), build_id_hex
);
75 if (asprintf(&bf
, "%s/.build-id/%.2s/%s", buildid_dir
,
76 build_id_hex
, build_id_hex
+ 2) < 0)
79 snprintf(bf
, size
, "%s/.build-id/%.2s/%s", buildid_dir
,
80 build_id_hex
, build_id_hex
+ 2);