blob: 1efe5b180f583f9d807e819b657e210ca6e250e6 [file] [log] [blame]
The Android Open Source Project10e23ee2009-03-03 19:30:30 -08001/**
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, 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
38char * 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}