110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/**
210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @file op_mangle.c
310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Mangling of sample file names
410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Copyright 2002 OProfile authors
610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Read the file COPYING
710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author John Levon
910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author Philippe Elie
1010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */
1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_mangle.h"
1310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <string.h>
1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdio.h>
1610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_libiberty.h"
1810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_sample_file.h"
2010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_config.h"
2110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
2210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void append_image(char * dest, int flags, int anon, char const * name, char const * anon_name)
2310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
2410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if ((flags & MANGLE_KERNEL) && !strchr(name, '/')) {
2510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		strcat(dest, "{kern}/");
2610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	} else if (anon) {
2710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		strcat(dest, "{anon:");
2810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		strcat(dest, anon_name);
2910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		strcat(dest,"}/");
3010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	} else {
3110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		strcat(dest, "{root}/");
3210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
3310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	strcat(dest, name);
3510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	strcat(dest, "/");
3610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
3710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectchar * op_mangle_filename(struct mangle_values const * values)
3910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
4010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	char * mangled;
4110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	size_t len;
4210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	int anon = values->flags & MANGLE_ANON;
4310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	int cg_anon = values->flags & MANGLE_CG_ANON;
4410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	/* if dep_name != image_name we need to invert them (and so revert them
4510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	 * unconditionally because if they are equal it doesn't hurt to invert
4610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	 * them), see P:3, FIXME: this is a bit weirds, we prolly need to
4710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	 * reword pp_interface */
4810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	char const * image_name = values->dep_name;
4910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	char const * anon_name = values->anon_name;
5010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	char const * dep_name = values->image_name;
5110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	char const * cg_image_name = values->cg_image_name;
5210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
5310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	len = strlen(op_samples_current_dir) + strlen(dep_name) + 1
5410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		+ strlen(values->event_name) + 1 + strlen(image_name) + 1;
5510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
5610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (values->flags & MANGLE_CALLGRAPH)
5710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		len += strlen(cg_image_name) + 1;
5810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
5910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (anon || cg_anon)
6010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		len += strlen(anon_name);
6110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
6210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	/* provision for tgid, tid, unit_mask, cpu and some {root}, {dep},
6310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	 * {kern}, {anon} and {cg} marker */
6410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	/* FIXME: too ugly */
6510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	len += 256;
6610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
6710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	mangled = xmalloc(len);
6810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
6910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	strcpy(mangled, op_samples_current_dir);
7010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	append_image(mangled, values->flags, 0, image_name, anon_name);
7110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
7210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	strcat(mangled, "{dep}" "/");
7310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	append_image(mangled, values->flags, anon, dep_name, anon_name);
7410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
7510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (values->flags & MANGLE_CALLGRAPH) {
7610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		strcat(mangled, "{cg}" "/");
7710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		append_image(mangled, values->flags, cg_anon,
7810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		             cg_image_name, anon_name);
7910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
8010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
8110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	strcat(mangled, values->event_name);
8210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	sprintf(mangled + strlen(mangled), ".%d.%d.",
8310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	        values->count, values->unit_mask);
8410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
8510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (values->flags & MANGLE_TGID) {
8610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		sprintf(mangled + strlen(mangled), "%d.", values->tgid);
8710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	} else {
8810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		sprintf(mangled + strlen(mangled), "%s.", "all");
8910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
9010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
9110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (values->flags & MANGLE_TID) {
9210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		sprintf(mangled + strlen(mangled), "%d.", values->tid);
9310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	} else {
9410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		sprintf(mangled + strlen(mangled), "%s.", "all");
9510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
9610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
9710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (values->flags & MANGLE_CPU) {
9810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		sprintf(mangled + strlen(mangled), "%d", values->cpu);
9910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	} else {
10010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		sprintf(mangled + strlen(mangled), "%s", "all");
10110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
10210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
10310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	return mangled;
10410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
105