| /** |
| * @file op_mangle.c |
| * Mangling of sample file names |
| * |
| * @remark Copyright 2002 OProfile authors |
| * @remark Read the file COPYING |
| * |
| * @author John Levon |
| * @author Philippe Elie |
| */ |
| |
| #include "op_mangle.h" |
| |
| #include <string.h> |
| #include <stdio.h> |
| |
| #include "op_libiberty.h" |
| |
| #include "op_sample_file.h" |
| #include "op_config.h" |
| |
| static void append_image(char * dest, int flags, int anon, char const * name, char const * anon_name) |
| { |
| if ((flags & MANGLE_KERNEL) && !strchr(name, '/')) { |
| strcat(dest, "{kern}/"); |
| } else if (anon) { |
| strcat(dest, "{anon:"); |
| strcat(dest, anon_name); |
| strcat(dest,"}/"); |
| } else { |
| strcat(dest, "{root}/"); |
| } |
| |
| strcat(dest, name); |
| strcat(dest, "/"); |
| } |
| |
| char * op_mangle_filename(struct mangle_values const * values) |
| { |
| char * mangled; |
| size_t len; |
| int anon = values->flags & MANGLE_ANON; |
| int cg_anon = values->flags & MANGLE_CG_ANON; |
| /* if dep_name != image_name we need to invert them (and so revert them |
| * unconditionally 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 * anon_name = values->anon_name; |
| char const * dep_name = values->image_name; |
| char const * cg_image_name = values->cg_image_name; |
| |
| len = strlen(op_samples_current_dir) + strlen(dep_name) + 1 |
| + strlen(values->event_name) + 1 + strlen(image_name) + 1; |
| |
| if (values->flags & MANGLE_CALLGRAPH) |
| len += strlen(cg_image_name) + 1; |
| |
| if (anon || cg_anon) |
| len += strlen(anon_name); |
| |
| /* provision for tgid, tid, unit_mask, cpu and some {root}, {dep}, |
| * {kern}, {anon} and {cg} marker */ |
| /* FIXME: too ugly */ |
| len += 256; |
| |
| mangled = xmalloc(len); |
| |
| strcpy(mangled, op_samples_current_dir); |
| append_image(mangled, values->flags, 0, image_name, anon_name); |
| |
| strcat(mangled, "{dep}" "/"); |
| append_image(mangled, values->flags, anon, dep_name, anon_name); |
| |
| if (values->flags & MANGLE_CALLGRAPH) { |
| strcat(mangled, "{cg}" "/"); |
| append_image(mangled, values->flags, cg_anon, |
| cg_image_name, anon_name); |
| } |
| |
| strcat(mangled, values->event_name); |
| sprintf(mangled + strlen(mangled), ".%d.%d.", |
| values->count, values->unit_mask); |
| |
| if (values->flags & MANGLE_TGID) { |
| sprintf(mangled + strlen(mangled), "%d.", values->tgid); |
| } else { |
| sprintf(mangled + strlen(mangled), "%s.", "all"); |
| } |
| |
| if (values->flags & MANGLE_TID) { |
| sprintf(mangled + strlen(mangled), "%d.", values->tid); |
| } else { |
| sprintf(mangled + strlen(mangled), "%s.", "all"); |
| } |
| |
| if (values->flags & MANGLE_CPU) { |
| sprintf(mangled + strlen(mangled), "%d", values->cpu); |
| } else { |
| sprintf(mangled + strlen(mangled), "%s", "all"); |
| } |
| |
| return mangled; |
| } |