/**
* @file demangle_symbol.cpp
* Demangle a C++ symbol
*
* @remark Copyright 2002 OProfile authors
* @remark Read the file COPYING
*
* @author John Levon
*/
#include <cstdlib>
#include "config.h"
#include "demangle_symbol.h"
#include "demangle_java_symbol.h"
#include "op_regex.h"
// from libiberty
/*@{\name demangle option parameter */
#ifndef DMGL_PARAMS
# define DMGL_PARAMS (1 << 0) /**< Include function args */
#endif
#ifndef DMGL_ANSI
# define DMGL_ANSI (1 << 1) /**< Include const, volatile, etc */
#endif
/*@}*/
extern "C" char * cplus_demangle(char const * mangled, int options);
using namespace std;
namespace options {
extern demangle_type demangle;
}
string const demangle_symbol(string const & name)
{
if (options::demangle == dmt_none)
return name;
// Do not try to strip leading underscore, as this leads to many
// C++ demangling failures. However we strip off a leading '.'
// as generated on PPC64
string const & tmp = (name[0] == '.' ? name.substr(1) : name);
char * unmangled = cplus_demangle(tmp.c_str(), DMGL_PARAMS | DMGL_ANSI);
if (!unmangled) {
string result = demangle_java_symbol(name);
if (!result.empty())
return result;
return name;
}
string result(unmangled);
free(unmangled);
if (options::demangle == dmt_smart) {
static bool init = false;
static regular_expression_replace regex;
if (init == false) {
setup_regex(regex, OP_DATADIR "/stl.pat");
init = true;
}
// we don't protect against exception here, pattern must be
// right and user can easily work-around by using -d
regex.execute(result);
}
return result;
}