Ejemplo n.º 1
0
static bool onSymbol( const char* sym, size_t offset, void* data ) {
  if( sym[0] != '_' || sym[1] != 'Z' ) {
    // Not a mangled name - ignore.
    return true;
  }

  void* toFree = NULL;
  struct demangle_component* info = cplus_demangle_v3_components( sym, DMGL_NO_OPTS, &toFree );
  if( info == NULL ) {
    // Could not demangle - no big deal.
    return true;
  }

  struct demangle_component* qual = NULL;
  if( info->type == DEMANGLE_COMPONENT_QUAL_NAME ) {
    qual = info->u.s_binary.left;
    info = info->u.s_binary.right;
  }

  if( info->type == DEMANGLE_COMPONENT_CTOR ||
      info->type == DEMANGLE_COMPONENT_DTOR ) {
    wrapSymbol( sym, (module_data_t*)data, offset, qual, info );
  }

  free( toFree );
  return true;
}
Ejemplo n.º 2
0
static struct demangle_component *
mangled_name_to_comp (const char *mangled_name, int options,
		      void **memory, char **demangled_p)
{
  struct demangle_component *ret;
  char *demangled_name;

  /* If it looks like a v3 mangled name, then try to go directly
     to trees.  */
  if (mangled_name[0] == '_' && mangled_name[1] == 'Z')
    {
      ret = cplus_demangle_v3_components (mangled_name, options, memory);
      if (ret)
	{
	  *demangled_p = NULL;
	  return ret;
	}
    }

  /* If it doesn't, or if that failed, then try to demangle the name.  */
  demangled_name = cplus_demangle (mangled_name, options);
  if (demangled_name == NULL)
   return NULL;
  
  /* If we could demangle the name, parse it to build the component tree.  */
  ret = cp_demangled_name_to_comp (demangled_name, NULL);

  if (ret == NULL)
    {
      xfree (demangled_name);
      return NULL;
    }

  *demangled_p = demangled_name;
  return ret;
}