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