From: Philippe E. <ph...@us...> - 2004-01-04 13:54:11
|
Update of /cvsroot/oprofile/oprofile/libop In directory sc8-pr-cvs1:/tmp/cvs-serv953/libop Modified Files: Tag: BRANCH_CALLGRAPH op_mangle.c op_mangle.h Log Message: Big. Better handling of callgraph. Only opgprof can handle callgraph but in a less ugly way than previosly. Daemon now create cross-binary call graph. Fix a cg filename filtering bug (Run this fix the invalid filename error you get). Index: op_mangle.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/libop/op_mangle.c,v retrieving revision 1.8.2.1 retrieving revision 1.8.2.2 diff -u -p -d -r1.8.2.1 -r1.8.2.2 --- op_mangle.c 13 Jun 2003 20:37:20 -0000 1.8.2.1 +++ op_mangle.c 4 Jan 2004 13:54:08 -0000 1.8.2.2 @@ -19,56 +19,55 @@ #include "op_sample_file.h" #include "op_config.h" +static void append_separator(char * dest, int flags, char const * image_name) +{ + if ((flags & MANGLE_KERNEL) && !strchr(image_name, '/')) { + strcat(dest, "{kern}" "/"); + } else { + strcat(dest, "{root}" "/"); + } +} + char * op_mangle_filename(struct mangle_values const * values) { char * mangled; size_t len; - char const * image_name = values->image_name; - char const * dep_name = values->dep_name; + /* if dep_name != image_name we need to revert them (and so revert them + * unconditionnaly because if they are equal it doesn't hurt to invert + * them), see P:3, FIXME: this is a bit weirds, we prolly need to + * reword pp_interface */ + char const * image_name = values->dep_name; + char const * dep_name = values->image_name; len = strlen(OP_SAMPLES_CURRENT_DIR) + strlen(values->image_name) - + 1 + strlen(values->event_name) + 1; - - if (values->flags & MANGLE_DEP_NAME) { - len += strlen(values->dep_name) + 1; + + 1 + strlen(values->event_name) + + 1 + strlen(values->dep_name) + 1; - /* PP:3 image_name and dep_name are reversed when - * profiling with --separate */ - image_name = values->dep_name; - dep_name = values->image_name; - } + if (values->flags & MANGLE_CALLGRAPH) + len += strlen(values->cg_image_name) + 1; - /* provision for tgid, tid, unit_mask, cpu and three {root}, {dep} or - * {kern} marker */ + /* provision for tgid, tid, unit_mask, cpu and some {root}, {dep}, + * {kern} and {cg} marker */ len += 256; /* FIXME: too ugly */ mangled = xmalloc(len); strcpy(mangled, OP_SAMPLES_CURRENT_DIR); - - if ((values->flags & MANGLE_KERNEL) && !strchr(image_name, '/')) { - strcat(mangled, "{kern}" "/"); - } else { - strcat(mangled, "{root}" "/"); - } - + append_separator(mangled, values->flags, image_name); strcat(mangled, image_name); strcat(mangled, "/"); - if (values->flags & MANGLE_DEP_NAME) { - strcat(mangled, "{dep}" "/"); - if ((values->flags & MANGLE_KERNEL) - && !strchr(image_name, '/')) { - strcat(mangled, "{kern}" "/"); - } else { - strcat(mangled, "{root}" "/"); - } - strcat(mangled, dep_name); - strcat(mangled, "/"); - } + strcat(mangled, "{dep}" "/"); + append_separator(mangled, values->flags, image_name); + strcat(mangled, dep_name); + strcat(mangled, "/"); - if (values->flags & MANGLE_CALLGRAPH) + if (values->flags & MANGLE_CALLGRAPH) { strcat(mangled, "{cg}" "/"); + append_separator(mangled, values->flags, values->cg_image_name); + strcat(mangled, values->cg_image_name); + strcat(mangled, "/"); + } strcat(mangled, values->event_name); sprintf(mangled + strlen(mangled), ".%d.%d.", Index: op_mangle.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/libop/op_mangle.h,v retrieving revision 1.6.2.1 retrieving revision 1.6.2.2 diff -u -p -d -r1.6.2.1 -r1.6.2.2 --- op_mangle.h 13 Jun 2003 20:37:20 -0000 1.6.2.1 +++ op_mangle.h 4 Jan 2004 13:54:08 -0000 1.6.2.2 @@ -20,12 +20,11 @@ extern "C" { enum mangle_flags { MANGLE_NONE = 0, - MANGLE_DEP_NAME = (1 << 0), - MANGLE_CPU = (1 << 1), - MANGLE_TGID = (1 << 2), - MANGLE_TID = (1 << 3), - MANGLE_KERNEL = (1 << 4), - MANGLE_CALLGRAPH = (1 << 5) + MANGLE_CPU = (1 << 0), + MANGLE_TGID = (1 << 1), + MANGLE_TID = (1 << 2), + MANGLE_KERNEL = (1 << 3), + MANGLE_CALLGRAPH = (1 << 4) }; /** @@ -38,6 +37,7 @@ struct mangle_values { char const * image_name; char const * dep_name; + char const * cg_image_name; char const * event_name; int count; unsigned int unit_mask; |