• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
append_image(char * dest,int flags,int anon,char const * name,char const * anon_name)22 static void append_image(char * dest, int flags, int anon, char const * name, char const * anon_name)
23 {
24 	if ((flags & MANGLE_KERNEL) && !strchr(name, '/')) {
25 		strcat(dest, "{kern}/");
26 	} else if (anon) {
27 		strcat(dest, "{anon:");
28 		strcat(dest, anon_name);
29 		strcat(dest,"}/");
30 	} else {
31 		strcat(dest, "{root}/");
32 	}
33 
34 	strcat(dest, name);
35 	strcat(dest, "/");
36 }
37 
op_mangle_filename(struct mangle_values const * values)38 char * op_mangle_filename(struct mangle_values const * values)
39 {
40 	char * mangled;
41 	size_t len;
42 	int anon = values->flags & MANGLE_ANON;
43 	int cg_anon = values->flags & MANGLE_CG_ANON;
44 	/* if dep_name != image_name we need to invert them (and so revert them
45 	 * unconditionally because if they are equal it doesn't hurt to invert
46 	 * them), see P:3, FIXME: this is a bit weirds, we prolly need to
47 	 * reword pp_interface */
48 	char const * image_name = values->dep_name;
49 	char const * anon_name = values->anon_name;
50 	char const * dep_name = values->image_name;
51 	char const * cg_image_name = values->cg_image_name;
52 
53 	len = strlen(op_samples_current_dir) + strlen(dep_name) + 1
54 		+ strlen(values->event_name) + 1 + strlen(image_name) + 1;
55 
56 	if (values->flags & MANGLE_CALLGRAPH)
57 		len += strlen(cg_image_name) + 1;
58 
59 	if (anon || cg_anon)
60 		len += strlen(anon_name);
61 
62 	/* provision for tgid, tid, unit_mask, cpu and some {root}, {dep},
63 	 * {kern}, {anon} and {cg} marker */
64 	/* FIXME: too ugly */
65 	len += 256;
66 
67 	mangled = xmalloc(len);
68 
69 	strcpy(mangled, op_samples_current_dir);
70 	append_image(mangled, values->flags, 0, image_name, anon_name);
71 
72 	strcat(mangled, "{dep}" "/");
73 	append_image(mangled, values->flags, anon, dep_name, anon_name);
74 
75 	if (values->flags & MANGLE_CALLGRAPH) {
76 		strcat(mangled, "{cg}" "/");
77 		append_image(mangled, values->flags, cg_anon,
78 		             cg_image_name, anon_name);
79 	}
80 
81 	strcat(mangled, values->event_name);
82 	sprintf(mangled + strlen(mangled), ".%d.%d.",
83 	        values->count, values->unit_mask);
84 
85 	if (values->flags & MANGLE_TGID) {
86 		sprintf(mangled + strlen(mangled), "%d.", values->tgid);
87 	} else {
88 		sprintf(mangled + strlen(mangled), "%s.", "all");
89 	}
90 
91 	if (values->flags & MANGLE_TID) {
92 		sprintf(mangled + strlen(mangled), "%d.", values->tid);
93 	} else {
94 		sprintf(mangled + strlen(mangled), "%s.", "all");
95 	}
96 
97 	if (values->flags & MANGLE_CPU) {
98 		sprintf(mangled + strlen(mangled), "%d", values->cpu);
99 	} else {
100 		sprintf(mangled + strlen(mangled), "%s", "all");
101 	}
102 
103 	return mangled;
104 }
105