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