diff options
| author | Adrian Hunter <adrian.hunter@intel.com> | 2014-10-30 10:09:43 -0400 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2014-11-03 16:06:40 -0500 |
| commit | f2bff007679e7d293cb07bb26e18ccf11cc1c4b2 (patch) | |
| tree | 86ac27cc32eec0977767684006c6d1963e9efe26 | |
| parent | 92a9e4f7db89a013e1bdef2e548928fc71e9867c (diff) | |
perf tools: Add branch type to db export
Add the ability to export branch types through the database export
facility.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1414678188-14946-3-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
| -rw-r--r-- | tools/perf/util/db-export.c | 48 | ||||
| -rw-r--r-- | tools/perf/util/db-export.h | 6 |
2 files changed, 54 insertions, 0 deletions
diff --git a/tools/perf/util/db-export.c b/tools/perf/util/db-export.c index be128b075a32..bccb83120971 100644 --- a/tools/perf/util/db-export.c +++ b/tools/perf/util/db-export.c | |||
| @@ -208,6 +208,15 @@ static int db_ids_from_al(struct db_export *dbe, struct addr_location *al, | |||
| 208 | return 0; | 208 | return 0; |
| 209 | } | 209 | } |
| 210 | 210 | ||
| 211 | int db_export__branch_type(struct db_export *dbe, u32 branch_type, | ||
| 212 | const char *name) | ||
| 213 | { | ||
| 214 | if (dbe->export_branch_type) | ||
| 215 | return dbe->export_branch_type(dbe, branch_type, name); | ||
| 216 | |||
| 217 | return 0; | ||
| 218 | } | ||
| 219 | |||
| 211 | int db_export__sample(struct db_export *dbe, union perf_event *event, | 220 | int db_export__sample(struct db_export *dbe, union perf_event *event, |
| 212 | struct perf_sample *sample, struct perf_evsel *evsel, | 221 | struct perf_sample *sample, struct perf_evsel *evsel, |
| 213 | struct thread *thread, struct addr_location *al) | 222 | struct thread *thread, struct addr_location *al) |
| @@ -268,3 +277,42 @@ int db_export__sample(struct db_export *dbe, union perf_event *event, | |||
| 268 | 277 | ||
| 269 | return 0; | 278 | return 0; |
| 270 | } | 279 | } |
| 280 | |||
| 281 | static struct { | ||
| 282 | u32 branch_type; | ||
| 283 | const char *name; | ||
| 284 | } branch_types[] = { | ||
| 285 | {0, "no branch"}, | ||
| 286 | {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL, "call"}, | ||
| 287 | {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_RETURN, "return"}, | ||
| 288 | {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CONDITIONAL, "conditional jump"}, | ||
| 289 | {PERF_IP_FLAG_BRANCH, "unconditional jump"}, | ||
| 290 | {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL | PERF_IP_FLAG_INTERRUPT, | ||
| 291 | "software interrupt"}, | ||
| 292 | {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_RETURN | PERF_IP_FLAG_INTERRUPT, | ||
| 293 | "return from interrupt"}, | ||
| 294 | {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL | PERF_IP_FLAG_SYSCALLRET, | ||
| 295 | "system call"}, | ||
| 296 | {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_RETURN | PERF_IP_FLAG_SYSCALLRET, | ||
| 297 | "return from system call"}, | ||
| 298 | {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_ASYNC, "asynchronous branch"}, | ||
| 299 | {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL | PERF_IP_FLAG_ASYNC | | ||
| 300 | PERF_IP_FLAG_INTERRUPT, "hardware interrupt"}, | ||
| 301 | {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_TX_ABORT, "transaction abort"}, | ||
| 302 | {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_TRACE_BEGIN, "trace begin"}, | ||
| 303 | {PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_TRACE_END, "trace end"}, | ||
| 304 | {0, NULL} | ||
| 305 | }; | ||
| 306 | |||
| 307 | int db_export__branch_types(struct db_export *dbe) | ||
| 308 | { | ||
| 309 | int i, err = 0; | ||
| 310 | |||
| 311 | for (i = 0; branch_types[i].name ; i++) { | ||
| 312 | err = db_export__branch_type(dbe, branch_types[i].branch_type, | ||
| 313 | branch_types[i].name); | ||
| 314 | if (err) | ||
| 315 | break; | ||
| 316 | } | ||
| 317 | return err; | ||
| 318 | } | ||
diff --git a/tools/perf/util/db-export.h b/tools/perf/util/db-export.h index b3643e8e5750..e4baa45ead70 100644 --- a/tools/perf/util/db-export.h +++ b/tools/perf/util/db-export.h | |||
| @@ -54,6 +54,8 @@ struct db_export { | |||
| 54 | struct machine *machine); | 54 | struct machine *machine); |
| 55 | int (*export_symbol)(struct db_export *dbe, struct symbol *sym, | 55 | int (*export_symbol)(struct db_export *dbe, struct symbol *sym, |
| 56 | struct dso *dso); | 56 | struct dso *dso); |
| 57 | int (*export_branch_type)(struct db_export *dbe, u32 branch_type, | ||
| 58 | const char *name); | ||
| 57 | int (*export_sample)(struct db_export *dbe, struct export_sample *es); | 59 | int (*export_sample)(struct db_export *dbe, struct export_sample *es); |
| 58 | u64 evsel_last_db_id; | 60 | u64 evsel_last_db_id; |
| 59 | u64 machine_last_db_id; | 61 | u64 machine_last_db_id; |
| @@ -79,8 +81,12 @@ int db_export__dso(struct db_export *dbe, struct dso *dso, | |||
| 79 | struct machine *machine); | 81 | struct machine *machine); |
| 80 | int db_export__symbol(struct db_export *dbe, struct symbol *sym, | 82 | int db_export__symbol(struct db_export *dbe, struct symbol *sym, |
| 81 | struct dso *dso); | 83 | struct dso *dso); |
| 84 | int db_export__branch_type(struct db_export *dbe, u32 branch_type, | ||
| 85 | const char *name); | ||
| 82 | int db_export__sample(struct db_export *dbe, union perf_event *event, | 86 | int db_export__sample(struct db_export *dbe, union perf_event *event, |
| 83 | struct perf_sample *sample, struct perf_evsel *evsel, | 87 | struct perf_sample *sample, struct perf_evsel *evsel, |
| 84 | struct thread *thread, struct addr_location *al); | 88 | struct thread *thread, struct addr_location *al); |
| 85 | 89 | ||
| 90 | int db_export__branch_types(struct db_export *dbe); | ||
| 91 | |||
| 86 | #endif | 92 | #endif |
