Ejemplo n.º 1
0
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));
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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);
}
Ejemplo n.º 6
0
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;
}