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; }
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; }