const char * gimple_decl_printable_name (tree decl, int verbosity) { if (!DECL_NAME (decl)) return NULL; if (DECL_ASSEMBLER_NAME_SET_P (decl)) { const char *str, *mangled_str; int dmgl_opts = DMGL_NO_OPTS; if (verbosity >= 2) { dmgl_opts = DMGL_VERBOSE | DMGL_ANSI | DMGL_GNU_V3 | DMGL_RET_POSTFIX; if (TREE_CODE (decl) == FUNCTION_DECL) dmgl_opts |= DMGL_PARAMS; } mangled_str = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); str = cplus_demangle_v3 (mangled_str, dmgl_opts); return (str) ? str : mangled_str; } return IDENTIFIER_POINTER (DECL_NAME (decl)); }
static bool DeMangleGCC( const char *symbol ) { bool result = false; int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES; char *s = 0; #ifdef IN_GLIBCPP_V3 int status=0; #endif /* Attempt to demangle. */ #ifdef IN_GLIBCPP_V3 s = __cxa_demangle ( argv[i], NULL, NULL, &status ); #else s = cplus_demangle_v3 ( symbol, options ); #endif /* If it worked, print the demangled name. */ if ( s != NULL ) { std::cout << s << "\n"; free ( s ); result=true; } else { #ifdef IN_GLIBCPP_V3 //std::cout << "Failed: "<< symbol << "(status " << status << ")\n"; #else //std::cout << "Failed: " << symbol << "\n"; #endif } return result; }
char* demangle(const char* mangled) { // Note: __cxa_demangle default is DMGL_PARAMS | DMGL_TYPES, // while standalone default is DMGL_PARAMS | DMGL_TYPES char* demangled = cplus_demangle_v3(mangled, DMGL_PARAMS | DMGL_TYPES); return demangled; }
R_API char *r_bin_demangle_cxx(const char *str) { char *out; int flags = DMGL_TYPES | DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE; // | DMGL_RET_POSTFIX | DMGL_TYPES; if (*str==str[1] && *str=='_') str++; else if (!strncmp (str, "__symbol_stub1_", 15)) str += 15; out = cplus_demangle_v3 (str, flags); return out; }
static char * demangle(const char *mangled, DWORD Flags) { assert(mangled); // There can be false negatives, such as "_ZwTerminateProcess@8" if (mangled[0] != '_' || mangled[1] != 'Z') { return NULL; } int options = DMGL_PARAMS | DMGL_TYPES; if (Flags & UNDNAME_NAME_ONLY) { options = DMGL_NO_OPTS; } if (Flags & UNDNAME_NO_ARGUMENTS) { options &= ~DMGL_PARAMS; } return cplus_demangle_v3(mangled, options); }
static int bt_callback (void *data, uintptr_t pc, const char *filename, int lineno, const char *function) { int *pcount = (int *) data; /* If we don't have any useful information, don't print anything. */ if (filename == NULL && function == NULL) return 0; /* Skip functions in diagnostic.c. */ if (*pcount == 0 && filename != NULL && strcmp (lbasename (filename), "diagnostic.c") == 0) return 0; /* Print up to 20 functions. We could make this a --param, but since this is only for debugging just use a constant for now. */ if (*pcount >= 20) { /* Returning a non-zero value stops the backtrace. */ return 1; } ++*pcount; char *alc = NULL; if (function != NULL) { char *str = cplus_demangle_v3 (function, (DMGL_VERBOSE | DMGL_ANSI | DMGL_GNU_V3 | DMGL_PARAMS)); if (str != NULL) { alc = str; function = str; } for (size_t i = 0; i < ARRAY_SIZE (bt_stop); ++i) { size_t len = strlen (bt_stop[i]); if (strncmp (function, bt_stop[i], len) == 0 && (function[len] == '\0' || function[len] == '(')) { if (alc != NULL) free (alc); /* Returning a non-zero value stops the backtrace. */ return 1; } } } fprintf (stderr, "0x%lx %s\n\t%s:%d\n", (unsigned long) pc, function == NULL ? "???" : function, filename == NULL ? "???" : filename, lineno); if (alc != NULL) free (alc); return 0; }