op_mangle.c revision cc2ee177dbb3befca43e36cfc56778b006c3d050
1/** 2 * @file op_mangle.c 3 * Mangling of sample file names 4 * 5 * @remark Copyright 2002 OProfile authors 6 * @remark Read the file COPYING 7 * 8 * @author John Levon 9 * @author Philippe Elie 10 */ 11 12#include "op_mangle.h" 13 14#include <string.h> 15#include <stdio.h> 16 17#include "op_libiberty.h" 18 19#include "op_sample_file.h" 20#include "op_config.h" 21 22static void append_image(char * dest, int flags, int anon, char const * name) 23{ 24 if ((flags & MANGLE_KERNEL) && !strchr(name, '/')) { 25 strcat(dest, "{kern}/"); 26 } else if (anon) { 27 strcat(dest, "{anon}/"); 28 } else { 29 strcat(dest, "{root}/"); 30 } 31 32 strcat(dest, name); 33 strcat(dest, "/"); 34} 35 36char * op_mangle_filename(struct mangle_values const * values) 37{ 38 char * mangled; 39 size_t len; 40 int anon = values->flags & MANGLE_ANON; 41 int cg_anon = values->flags & MANGLE_CG_ANON; 42 /* if dep_name != image_name we need to invert them (and so revert them 43 * unconditionally because if they are equal it doesn't hurt to invert 44 * them), see P:3, FIXME: this is a bit weirds, we prolly need to 45 * reword pp_interface */ 46 char const * image_name = values->dep_name; 47 char const * dep_name = values->image_name; 48 char const * cg_image_name = values->cg_image_name; 49 50 len = strlen(OP_SAMPLES_CURRENT_DIR) + strlen(dep_name) + 1 51 + strlen(values->event_name) + 1 + strlen(image_name) + 1; 52 53 if (values->flags & MANGLE_CALLGRAPH) 54 len += strlen(cg_image_name) + 1; 55 56 /* provision for tgid, tid, unit_mask, cpu and some {root}, {dep}, 57 * {kern}, {anon} and {cg} marker */ 58 /* FIXME: too ugly */ 59 len += 256; 60 61 mangled = xmalloc(len); 62 63 strcpy(mangled, OP_SAMPLES_CURRENT_DIR); 64 append_image(mangled, values->flags, 0, image_name); 65 66 strcat(mangled, "{dep}" "/"); 67 append_image(mangled, values->flags, anon, dep_name); 68 69 if (values->flags & MANGLE_CALLGRAPH) { 70 strcat(mangled, "{cg}" "/"); 71 append_image(mangled, values->flags, cg_anon, cg_image_name); 72 } 73 74 strcat(mangled, values->event_name); 75 sprintf(mangled + strlen(mangled), ".%d.%d.", 76 values->count, values->unit_mask); 77 78 if (values->flags & MANGLE_TGID) { 79 sprintf(mangled + strlen(mangled), "%d.", values->tgid); 80 } else { 81 sprintf(mangled + strlen(mangled), "%s.", "all"); 82 } 83 84 if (values->flags & MANGLE_TID) { 85 sprintf(mangled + strlen(mangled), "%d.", values->tid); 86 } else { 87 sprintf(mangled + strlen(mangled), "%s.", "all"); 88 } 89 90 if (values->flags & MANGLE_CPU) { 91 sprintf(mangled + strlen(mangled), "%d", values->cpu); 92 } else { 93 sprintf(mangled + strlen(mangled), "%s", "all"); 94 } 95 96 return mangled; 97} 98