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>
19 int build_id__mark_dso_hit(struct perf_tool
*tool __maybe_unused
,
20 union perf_event
*event
,
21 struct perf_sample
*sample
,
22 struct perf_evsel
*evsel __maybe_unused
,
23 struct machine
*machine
)
25 struct addr_location al
;
26 u8 cpumode
= event
->header
.misc
& PERF_RECORD_MISC_CPUMODE_MASK
;
27 struct thread
*thread
= machine__findnew_thread(machine
, sample
->pid
,
31 pr_err("problem processing %d event, skipping it.\n",
36 thread__find_addr_map(thread
, machine
, cpumode
, MAP__FUNCTION
,
45 static int perf_event__exit_del_thread(struct perf_tool
*tool __maybe_unused
,
46 union perf_event
*event
,
47 struct perf_sample
*sample
49 struct machine
*machine
)
51 struct thread
*thread
= machine__findnew_thread(machine
,
55 dump_printf("(%d:%d):(%d:%d)\n", event
->fork
.pid
, event
->fork
.tid
,
56 event
->fork
.ppid
, event
->fork
.ptid
);
59 rb_erase(&thread
->rb_node
, &machine
->threads
);
60 machine
->last_match
= NULL
;
61 thread__delete(thread
);
67 struct perf_tool build_id__mark_dso_hit_ops
= {
68 .sample
= build_id__mark_dso_hit
,
69 .mmap
= perf_event__process_mmap
,
70 .mmap2
= perf_event__process_mmap2
,
71 .fork
= perf_event__process_fork
,
72 .exit
= perf_event__exit_del_thread
,
73 .attr
= perf_event__process_attr
,
74 .build_id
= perf_event__process_build_id
,
77 int build_id__sprintf(const u8
*build_id
, int len
, char *bf
)
80 const u8
*raw
= build_id
;
83 for (i
= 0; i
< len
; ++i
) {
84 sprintf(bid
, "%02x", *raw
);
89 return raw
- build_id
;
92 char *dso__build_id_filename(struct dso
*self
, char *bf
, size_t size
)
94 char build_id_hex
[BUILD_ID_SIZE
* 2 + 1];
96 if (!self
->has_build_id
)
99 build_id__sprintf(self
->build_id
, sizeof(self
->build_id
), build_id_hex
);
101 if (asprintf(&bf
, "%s/.build-id/%.2s/%s", buildid_dir
,
102 build_id_hex
, build_id_hex
+ 2) < 0)
105 snprintf(bf
, size
, "%s/.build-id/%.2s/%s", buildid_dir
,
106 build_id_hex
, build_id_hex
+ 2);