From b448902b7c2d8fa734e0d5cb1e6acbb009db97e4 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 15 Oct 2012 22:04:42 -0400 Subject: [PATCH] callsite: support instruction pointer field Signed-off-by: Mathieu Desnoyers --- formats/ctf-text/ctf-text.c | 12 +++++++++--- .../ctf/metadata/ctf-visitor-generate-io-struct.c | 13 +++++++++++++ include/babeltrace/ctf-ir/metadata.h | 2 ++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/formats/ctf-text/ctf-text.c b/formats/ctf-text/ctf-text.c index 67400f51..40f2f008 100644 --- a/formats/ctf-text/ctf-text.c +++ b/formats/ctf-text/ctf-text.c @@ -427,9 +427,15 @@ int ctf_text_write_event(struct stream_pos *ppos, struct ctf_stream_definition * bt_list_for_each_entry(callsite, &cs_dups->head, node) { if (i != 0) fprintf(pos->fp, ","); - fprintf(pos->fp, "%s@%s:%" PRIu64 "", - callsite->func, callsite->file, - callsite->line); + if (CTF_CALLSITE_FIELD_IS_SET(callsite, ip)) { + fprintf(pos->fp, "%s@0x%" PRIx64 ":%s:%" PRIu64 "", + callsite->func, callsite->ip, callsite->file, + callsite->line); + } else { + fprintf(pos->fp, "%s:%s:%" PRIu64 "", + callsite->func, callsite->file, + callsite->line); + } i++; } fprintf(pos->fp, "]"); diff --git a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c index 9be7e161..de998611 100644 --- a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c +++ b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c @@ -2507,6 +2507,19 @@ int ctf_callsite_declaration_visit(FILE *fd, int depth, struct ctf_node *node, goto error; } CTF_CALLSITE_SET_FIELD(callsite, line); + } else if (!strcmp(left, "ip")) { + if (CTF_CALLSITE_FIELD_IS_SET(callsite, ip)) { + fprintf(fd, "[error] %s: ip already declared in callsite declaration\n", __func__); + ret = -EPERM; + goto error; + } + ret = get_unary_unsigned(&node->u.ctf_expression.right, &callsite->ip); + if (ret) { + fprintf(fd, "[error] %s: unexpected unary expression for callsite ip\n", __func__); + ret = -EINVAL; + goto error; + } + CTF_CALLSITE_SET_FIELD(callsite, ip); } else { fprintf(fd, "[warning] %s: attribute \"%s\" is unknown in callsite declaration.\n", __func__, left); } diff --git a/include/babeltrace/ctf-ir/metadata.h b/include/babeltrace/ctf-ir/metadata.h index 8e0eb054..e5c3240c 100644 --- a/include/babeltrace/ctf-ir/metadata.h +++ b/include/babeltrace/ctf-ir/metadata.h @@ -121,12 +121,14 @@ struct ctf_callsite { char *func; char *file; uint64_t line; + uint64_t ip; struct bt_list_head node; enum { /* Fields populated mask */ CTF_CALLSITE_name = (1U << 0), CTF_CALLSITE_func = (1U << 1), CTF_CALLSITE_file = (1U << 2), CTF_CALLSITE_line = (1U << 3), + CTF_CALLSITE_ip = (1U << 4), } field_mask; }; -- 2.34.1