jit: make gdb_object::symtabs an std::forward_list
[deliverable/binutils-gdb.git] / binutils / prdbg.c
index 7a0af83336e2e4e409c9d86d6891cac718c5154b..e582102ab35bf34d36cffc47c9dcfd57e1e221ec 100644 (file)
@@ -1,6 +1,5 @@
 /* prdbg.c -- Print out generic debugging information.
 /* prdbg.c -- Print out generic debugging information.
-   Copyright 1995, 1996, 1999, 2002, 2003, 2004, 2006
-   Free Software Foundation, Inc.
+   Copyright (C) 1995-2019 Free Software Foundation, Inc.
    Written by Ian Lance Taylor <ian@cygnus.com>.
    Tags style generation written by Salvador E. Tropea <set@computer.org>.
 
    Written by Ian Lance Taylor <ian@cygnus.com>.
    Tags style generation written by Salvador E. Tropea <set@computer.org>.
 
@@ -8,7 +7,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
 /* This file prints out the generic debugging information, by
    supplying a set of routines to debug_write.  */
 
 /* This file prints out the generic debugging information, by
    supplying a set of routines to debug_write.  */
 
-#include <stdio.h>
+#include "sysdep.h"
 #include <assert.h>
 #include <assert.h>
-
 #include "bfd.h"
 #include "bfd.h"
-#include "bucomm.h"
 #include "libiberty.h"
 #include "libiberty.h"
+#include "demangle.h"
 #include "debug.h"
 #include "budbg.h"
 
 #include "debug.h"
 #include "budbg.h"
 
@@ -53,7 +51,7 @@ struct pr_handle
   /* The symbols table for this BFD.  */
   asymbol **syms;
   /* Pointer to a function to demangle symbols.  */
   /* The symbols table for this BFD.  */
   asymbol **syms;
   /* Pointer to a function to demangle symbols.  */
-  char *(*demangler) (bfd *, const char *);
+  char *(*demangler) (bfd *, const char *, int);
 };
 
 /* The type stack.  */
 };
 
 /* The type stack.  */
@@ -288,12 +286,15 @@ static const struct debug_write_fns tg_fns =
   pr_end_function,             /* Same, does nothing.  */
   tg_lineno
 };
   pr_end_function,             /* Same, does nothing.  */
   tg_lineno
 };
+
+static int demangle_flags = DMGL_ANSI | DMGL_PARAMS;
 \f
 /* Print out the generic debugging information recorded in dhandle.  */
 
 bfd_boolean
 print_debugging_info (FILE *f, void *dhandle, bfd *abfd, asymbol **syms,
 \f
 /* Print out the generic debugging information recorded in dhandle.  */
 
 bfd_boolean
 print_debugging_info (FILE *f, void *dhandle, bfd *abfd, asymbol **syms,
-                     void *demangler, bfd_boolean as_tags)
+                     char * (*demangler) (struct bfd *, const char *, int),
+                     bfd_boolean as_tags)
 {
   struct pr_handle info;
 
 {
   struct pr_handle info;
 
@@ -500,6 +501,26 @@ print_vma (bfd_vma vma, char *buf, bfd_boolean unsignedp, bfd_boolean hexp)
       else
        sprintf (buf, "%ld", (long) vma);
     }
       else
        sprintf (buf, "%ld", (long) vma);
     }
+#if BFD_HOST_64BIT_LONG_LONG
+  else if (sizeof (vma) <= sizeof (unsigned long long))
+    {
+#ifndef __MSVCRT__
+      if (hexp)
+       sprintf (buf, "0x%llx", (unsigned long long) vma);
+      else if (unsignedp)
+       sprintf (buf, "%llu", (unsigned long long) vma);
+      else
+       sprintf (buf, "%lld", (long long) vma);
+#else
+      if (hexp)
+       sprintf (buf, "0x%I64x", (unsigned long long) vma);
+      else if (unsignedp)
+       sprintf (buf, "%I64u", (unsigned long long) vma);
+      else
+       sprintf (buf, "%I64d", (long long) vma);
+#endif
+    }
+#endif
   else
     {
       buf[0] = '0';
   else
     {
       buf[0] = '0';
@@ -562,7 +583,7 @@ static bfd_boolean
 pr_int_type (void *p, unsigned int size, bfd_boolean unsignedp)
 {
   struct pr_handle *info = (struct pr_handle *) p;
 pr_int_type (void *p, unsigned int size, bfd_boolean unsignedp)
 {
   struct pr_handle *info = (struct pr_handle *) p;
-  char ab[10];
+  char ab[40];
 
   sprintf (ab, "%sint%d", unsignedp ? "u" : "", size * 8);
   return push_type (info, ab);
 
   sprintf (ab, "%sint%d", unsignedp ? "u" : "", size * 8);
   return push_type (info, ab);
@@ -574,7 +595,7 @@ static bfd_boolean
 pr_float_type (void *p, unsigned int size)
 {
   struct pr_handle *info = (struct pr_handle *) p;
 pr_float_type (void *p, unsigned int size)
 {
   struct pr_handle *info = (struct pr_handle *) p;
-  char ab[10];
+  char ab[40];
 
   if (size == 4)
     return push_type (info, "float");
 
   if (size == 4)
     return push_type (info, "float");
@@ -604,7 +625,7 @@ static bfd_boolean
 pr_bool_type (void *p, unsigned int size)
 {
   struct pr_handle *info = (struct pr_handle *) p;
 pr_bool_type (void *p, unsigned int size)
 {
   struct pr_handle *info = (struct pr_handle *) p;
-  char ab[10];
+  char ab[40];
 
   sprintf (ab, "bool%d", size * 8);
 
 
   sprintf (ab, "bool%d", size * 8);
 
@@ -653,7 +674,7 @@ pr_enum_type (void *p, const char *tag, const char **names,
 
          if (values[i] != val)
            {
 
          if (values[i] != val)
            {
-             char ab[20];
+             char ab[22];
 
              print_vma (values[i], ab, FALSE, FALSE);
              if (! append_type (info, " = ")
 
              print_vma (values[i], ab, FALSE, FALSE);
              if (! append_type (info, " = ")
@@ -712,10 +733,16 @@ pr_function_type (void *p, int argcount, bfd_boolean varargs)
       for (i = argcount - 1; i >= 0; i--)
        {
          if (! substitute_type (info, ""))
       for (i = argcount - 1; i >= 0; i--)
        {
          if (! substitute_type (info, ""))
-           return FALSE;
+           {
+             free (arg_types);
+             return FALSE;
+           }
          arg_types[i] = pop_type (info);
          if (arg_types[i] == NULL)
          arg_types[i] = pop_type (info);
          if (arg_types[i] == NULL)
-           return FALSE;
+           {
+             free (arg_types);
+             return FALSE;
+           }
          len += strlen (arg_types[i]) + 2;
        }
       if (varargs)
          len += strlen (arg_types[i]) + 2;
        }
       if (varargs)
@@ -724,7 +751,7 @@ pr_function_type (void *p, int argcount, bfd_boolean varargs)
 
   /* Now the return type is on the top of the stack.  */
 
 
   /* Now the return type is on the top of the stack.  */
 
-  s = xmalloc (len);
+  s = (char *) xmalloc (len);
   LITSTRCPY (s, "(|) (");
 
   if (argcount < 0)
   LITSTRCPY (s, "(|) (");
 
   if (argcount < 0)
@@ -777,7 +804,7 @@ static bfd_boolean
 pr_range_type (void *p, bfd_signed_vma lower, bfd_signed_vma upper)
 {
   struct pr_handle *info = (struct pr_handle *) p;
 pr_range_type (void *p, bfd_signed_vma lower, bfd_signed_vma upper)
 {
   struct pr_handle *info = (struct pr_handle *) p;
-  char abl[20], abu[20];
+  char abl[22], abu[22];
 
   assert (info->stack != NULL);
 
 
   assert (info->stack != NULL);
 
@@ -802,7 +829,7 @@ pr_array_type (void *p, bfd_signed_vma lower, bfd_signed_vma upper,
 {
   struct pr_handle *info = (struct pr_handle *) p;
   char *range_type;
 {
   struct pr_handle *info = (struct pr_handle *) p;
   char *range_type;
-  char abl[20], abu[20], ab[50];
+  char abl[22], abu[22], ab[50];
 
   range_type = pop_type (info);
   if (range_type == NULL)
 
   range_type = pop_type (info);
   if (range_type == NULL)
@@ -933,10 +960,16 @@ pr_method_type (void *p, bfd_boolean domain, int argcount, bfd_boolean varargs)
       for (i = argcount - 1; i >= 0; i--)
        {
          if (! substitute_type (info, ""))
       for (i = argcount - 1; i >= 0; i--)
        {
          if (! substitute_type (info, ""))
-           return FALSE;
+           {
+             free (arg_types);
+             return FALSE;
+           }
          arg_types[i] = pop_type (info);
          if (arg_types[i] == NULL)
          arg_types[i] = pop_type (info);
          if (arg_types[i] == NULL)
-           return FALSE;
+           {
+             free (arg_types);
+             return FALSE;
+           }
          len += strlen (arg_types[i]) + 2;
        }
       if (varargs)
          len += strlen (arg_types[i]) + 2;
        }
       if (varargs)
@@ -1120,7 +1153,7 @@ pr_struct_field (void *p, const char *name, bfd_vma bitpos, bfd_vma bitsize,
                 enum debug_visibility visibility)
 {
   struct pr_handle *info = (struct pr_handle *) p;
                 enum debug_visibility visibility)
 {
   struct pr_handle *info = (struct pr_handle *) p;
-  char ab[20];
+  char ab[22];
   char *t;
 
   if (! substitute_type (info, name))
   char *t;
 
   if (! substitute_type (info, name))
@@ -1298,13 +1331,13 @@ pr_class_static_member (void *p, const char *name, const char *physname,
 /* Add a base class to a class.  */
 
 static bfd_boolean
 /* Add a base class to a class.  */
 
 static bfd_boolean
-pr_class_baseclass (void *p, bfd_vma bitpos, bfd_boolean virtual,
+pr_class_baseclass (void *p, bfd_vma bitpos, bfd_boolean is_virtual,
                    enum debug_visibility visibility)
 {
   struct pr_handle *info = (struct pr_handle *) p;
   char *t;
   const char *prefix;
                    enum debug_visibility visibility)
 {
   struct pr_handle *info = (struct pr_handle *) p;
   char *t;
   const char *prefix;
-  char ab[20];
+  char ab[22];
   char *s, *l, *n;
 
   assert (info->stack != NULL && info->stack->next != NULL);
   char *s, *l, *n;
 
   assert (info->stack != NULL && info->stack->next != NULL);
@@ -1324,7 +1357,7 @@ pr_class_baseclass (void *p, bfd_vma bitpos, bfd_boolean virtual,
   if (! push_type (info, t))
     return FALSE;
 
   if (! push_type (info, t))
     return FALSE;
 
-  if (virtual)
+  if (is_virtual)
     {
       if (! prepend_type (info, "virtual "))
        return FALSE;
     {
       if (! prepend_type (info, "virtual "))
        return FALSE;
@@ -1464,7 +1497,7 @@ pr_class_method_variant (void *p, const char *physname,
     return FALSE;
   if (context || voffset != 0)
     {
     return FALSE;
   if (context || voffset != 0)
     {
-      char ab[20];
+      char ab[22];
 
       if (context)
        {
 
       if (context)
        {
@@ -1571,7 +1604,7 @@ pr_tag_type (void *p, const char *name, unsigned int id,
 {
   struct pr_handle *info = (struct pr_handle *) p;
   const char *t, *tag;
 {
   struct pr_handle *info = (struct pr_handle *) p;
   const char *t, *tag;
-  char idbuf[20];
+  char idbuf[22];
 
   switch (kind)
     {
 
   switch (kind)
     {
@@ -1667,7 +1700,7 @@ static bfd_boolean
 pr_int_constant (void *p, const char *name, bfd_vma val)
 {
   struct pr_handle *info = (struct pr_handle *) p;
 pr_int_constant (void *p, const char *name, bfd_vma val)
 {
   struct pr_handle *info = (struct pr_handle *) p;
-  char ab[20];
+  char ab[22];
 
   indent (info);
   print_vma (val, ab, FALSE, FALSE);
 
   indent (info);
   print_vma (val, ab, FALSE, FALSE);
@@ -1694,7 +1727,7 @@ pr_typed_constant (void *p, const char *name, bfd_vma val)
 {
   struct pr_handle *info = (struct pr_handle *) p;
   char *t;
 {
   struct pr_handle *info = (struct pr_handle *) p;
   char *t;
-  char ab[20];
+  char ab[22];
 
   t = pop_type (info);
   if (t == NULL)
 
   t = pop_type (info);
   if (t == NULL)
@@ -1717,7 +1750,7 @@ pr_variable (void *p, const char *name, enum debug_var_kind kind,
 {
   struct pr_handle *info = (struct pr_handle *) p;
   char *t;
 {
   struct pr_handle *info = (struct pr_handle *) p;
   char *t;
-  char ab[20];
+  char ab[22];
 
   if (! substitute_type (info, name))
     return FALSE;
 
   if (! substitute_type (info, name))
     return FALSE;
@@ -1780,7 +1813,7 @@ pr_function_parameter (void *p, const char *name,
 {
   struct pr_handle *info = (struct pr_handle *) p;
   char *t;
 {
   struct pr_handle *info = (struct pr_handle *) p;
   char *t;
-  char ab[20];
+  char ab[22];
 
   if (kind == DEBUG_PARM_REFERENCE
       || kind == DEBUG_PARM_REF_REG)
 
   if (kind == DEBUG_PARM_REFERENCE
       || kind == DEBUG_PARM_REF_REG)
@@ -1818,7 +1851,7 @@ static bfd_boolean
 pr_start_block (void *p, bfd_vma addr)
 {
   struct pr_handle *info = (struct pr_handle *) p;
 pr_start_block (void *p, bfd_vma addr)
 {
   struct pr_handle *info = (struct pr_handle *) p;
-  char ab[20];
+  char ab[22];
 
   if (info->parameter > 0)
     {
 
   if (info->parameter > 0)
     {
@@ -1841,7 +1874,7 @@ static bfd_boolean
 pr_lineno (void *p, const char *filename, unsigned long lineno, bfd_vma addr)
 {
   struct pr_handle *info = (struct pr_handle *) p;
 pr_lineno (void *p, const char *filename, unsigned long lineno, bfd_vma addr)
 {
   struct pr_handle *info = (struct pr_handle *) p;
-  char ab[20];
+  char ab[22];
 
   indent (info);
   print_vma (addr, ab, TRUE, TRUE);
 
   indent (info);
   print_vma (addr, ab, TRUE, TRUE);
@@ -1856,7 +1889,7 @@ static bfd_boolean
 pr_end_block (void *p, bfd_vma addr)
 {
   struct pr_handle *info = (struct pr_handle *) p;
 pr_end_block (void *p, bfd_vma addr)
 {
   struct pr_handle *info = (struct pr_handle *) p;
-  char ab[20];
+  char ab[22];
 
   info->indent -= 2;
 
 
   info->indent -= 2;
 
@@ -1897,14 +1930,14 @@ find_address_in_section (bfd *abfd, asection *section, void *data)
   if (found)
     return;
 
   if (found)
     return;
 
-  if ((bfd_get_section_flags (abfd, section) & SEC_ALLOC) == 0)
+  if ((bfd_section_flags (section) & SEC_ALLOC) == 0)
     return;
 
     return;
 
-  vma = bfd_get_section_vma (abfd, section);
+  vma = bfd_section_vma (section);
   if (pc < vma)
     return;
 
   if (pc < vma)
     return;
 
-  size = bfd_get_section_size (section);
+  size = bfd_section_size (section);
   if (pc >= vma + size)
     return;
 
   if (pc >= vma + size)
     return;
 
@@ -1928,15 +1961,13 @@ translate_addresses (bfd *abfd, char *addr_hex, FILE *f, asymbol **syms)
 /* Start a new compilation unit.  */
 
 static bfd_boolean
 /* Start a new compilation unit.  */
 
 static bfd_boolean
-tg_start_compilation_unit (void * p, const char *filename ATTRIBUTE_UNUSED)
+tg_start_compilation_unit (void * p, const char *fname ATTRIBUTE_UNUSED)
 {
   struct pr_handle *info = (struct pr_handle *) p;
 
 {
   struct pr_handle *info = (struct pr_handle *) p;
 
-  fprintf (stderr, "New compilation unit: %s\n", filename);
-
   free (info->filename);
   /* Should it be relative? best way to do it here?.  */
   free (info->filename);
   /* Should it be relative? best way to do it here?.  */
-  info->filename = strdup (filename);
+  info->filename = strdup (fname);
 
   return TRUE;
 }
 
   return TRUE;
 }
@@ -1944,13 +1975,13 @@ tg_start_compilation_unit (void * p, const char *filename ATTRIBUTE_UNUSED)
 /* Start a source file within a compilation unit.  */
 
 static bfd_boolean
 /* Start a source file within a compilation unit.  */
 
 static bfd_boolean
-tg_start_source (void *p, const char *filename)
+tg_start_source (void *p, const char *fname)
 {
   struct pr_handle *info = (struct pr_handle *) p;
 
   free (info->filename);
   /* Should it be relative? best way to do it here?.  */
 {
   struct pr_handle *info = (struct pr_handle *) p;
 
   free (info->filename);
   /* Should it be relative? best way to do it here?.  */
-  info->filename = strdup (filename);
+  info->filename = strdup (fname);
 
   return TRUE;
 }
 
   return TRUE;
 }
@@ -1964,7 +1995,7 @@ tg_enum_type (void *p, const char *tag, const char **names,
   struct pr_handle *info = (struct pr_handle *) p;
   unsigned int i;
   const char *name;
   struct pr_handle *info = (struct pr_handle *) p;
   unsigned int i;
   const char *name;
-  char ab[20];
+  char ab[22];
 
   if (! pr_enum_type (p, tag, names, values))
     return FALSE;
 
   if (! pr_enum_type (p, tag, names, values))
     return FALSE;
@@ -2071,8 +2102,7 @@ tg_struct_field (void *p, const char *name, bfd_vma bitpos ATTRIBUTE_UNUSED,
 static bfd_boolean
 tg_end_struct_type (void *p ATTRIBUTE_UNUSED)
 {
 static bfd_boolean
 tg_end_struct_type (void *p ATTRIBUTE_UNUSED)
 {
-  struct pr_handle *info = (struct pr_handle *) p;
-  assert (info->stack != NULL);
+  assert (((struct pr_handle *) p)->stack != NULL);
 
   return TRUE;
 }
 
   return TRUE;
 }
@@ -2087,6 +2117,7 @@ tg_start_class_type (void *p, const char *tag, unsigned int id,
   struct pr_handle *info = (struct pr_handle *) p;
   char *tv = NULL;
   const char *name;
   struct pr_handle *info = (struct pr_handle *) p;
   char *tv = NULL;
   const char *name;
+  char idbuf[20];
 
   info->indent += 2;
 
 
   info->indent += 2;
 
@@ -2101,8 +2132,6 @@ tg_start_class_type (void *p, const char *tag, unsigned int id,
     name = tag;
   else
     {
     name = tag;
   else
     {
-      char idbuf[20];
-
       sprintf (idbuf, "%%anon%u", id);
       name = idbuf;
     }
       sprintf (idbuf, "%%anon%u", id);
       name = idbuf;
     }
@@ -2153,23 +2182,36 @@ tg_class_static_member (void *p, const char *name,
 
   len_var = strlen (name);
   len_class = strlen (info->stack->next->type);
 
   len_var = strlen (name);
   len_class = strlen (info->stack->next->type);
-  full_name = xmalloc (len_var + len_class + 3);
+  full_name = (char *) xmalloc (len_var + len_class + 3);
   if (! full_name)
     return FALSE;
   sprintf (full_name, "%s::%s", info->stack->next->type, name);
 
   if (! substitute_type (info, full_name))
   if (! full_name)
     return FALSE;
   sprintf (full_name, "%s::%s", info->stack->next->type, name);
 
   if (! substitute_type (info, full_name))
-    return FALSE;
+    {
+      free (full_name);
+      return FALSE;
+    }
 
   if (! prepend_type (info, "static "))
 
   if (! prepend_type (info, "static "))
-    return FALSE;
+    {
+      free (full_name);
+      return FALSE;
+    }
 
   t = pop_type (info);
   if (t == NULL)
 
   t = pop_type (info);
   if (t == NULL)
-    return FALSE;
+    {
+      free (full_name);
+      return FALSE;
+    }
 
   if (! tg_fix_visibility (info, visibility))
 
   if (! tg_fix_visibility (info, visibility))
-    return FALSE;
+    {
+      free (t);
+      free (full_name);
+      return FALSE;
+    }
 
   fprintf (info->f, "%s\t%s\t0;\"\tkind:x\ttype:%s\tclass:%s\taccess:%s\n",
           name, info->filename, t, info->stack->type,
 
   fprintf (info->f, "%s\t%s\t0;\"\tkind:x\ttype:%s\tclass:%s\taccess:%s\n",
           name, info->filename, t, info->stack->type,
@@ -2184,7 +2226,7 @@ tg_class_static_member (void *p, const char *name,
 
 static bfd_boolean
 tg_class_baseclass (void *p, bfd_vma bitpos ATTRIBUTE_UNUSED,
 
 static bfd_boolean
 tg_class_baseclass (void *p, bfd_vma bitpos ATTRIBUTE_UNUSED,
-                   bfd_boolean virtual, enum debug_visibility visibility)
+                   bfd_boolean is_virtual, enum debug_visibility visibility)
 {
   struct pr_handle *info = (struct pr_handle *) p;
   char *t;
 {
   struct pr_handle *info = (struct pr_handle *) p;
   char *t;
@@ -2204,7 +2246,7 @@ tg_class_baseclass (void *p, bfd_vma bitpos ATTRIBUTE_UNUSED,
   if (! push_type (info, t))
     return FALSE;
 
   if (! push_type (info, t))
     return FALSE;
 
-  if (virtual)
+  if (is_virtual)
     {
       if (! prepend_type (info, "virtual "))
        return FALSE;
     {
       if (! prepend_type (info, "virtual "))
        return FALSE;
@@ -2279,12 +2321,18 @@ tg_class_method_variant (void *p, const char *physname ATTRIBUTE_UNUSED,
 
   /* Stick the name of the method into its type.  */
   if (! substitute_type (info, method_name))
 
   /* Stick the name of the method into its type.  */
   if (! substitute_type (info, method_name))
-    return FALSE;
+    {
+      free (method_name);
+      return FALSE;
+    }
 
   /* Get the type.  */
   method_type = pop_type (info);
   if (method_type == NULL)
 
   /* Get the type.  */
   method_type = pop_type (info);
   if (method_type == NULL)
-    return FALSE;
+    {
+      free (method_name);
+      return FALSE;
+    }
 
   /* Pull off the context type if there is one.  */
   if (! context)
 
   /* Pull off the context type if there is one.  */
   if (! context)
@@ -2293,12 +2341,21 @@ tg_class_method_variant (void *p, const char *physname ATTRIBUTE_UNUSED,
     {
       context_type = pop_type (info);
       if (context_type == NULL)
     {
       context_type = pop_type (info);
       if (context_type == NULL)
-       return FALSE;
+       {
+         free (method_type);
+         free (method_name);
+         return FALSE;
+       }
     }
 
   /* Now the top of the stack is the class.  */
   if (! tg_fix_visibility (info, visibility))
     }
 
   /* Now the top of the stack is the class.  */
   if (! tg_fix_visibility (info, visibility))
-    return FALSE;
+    {
+      free (method_type);
+      free (method_name);
+      free (context_type);
+      return FALSE;
+    }
 
   fprintf (info->f, "%s\t%s\t0;\"\tkind:p\ttype:%s\tclass:%s\n",
           method_name, info->filename, method_type, info->stack->type);
 
   fprintf (info->f, "%s\t%s\t0;\"\tkind:p\ttype:%s\tclass:%s\n",
           method_name, info->filename, method_type, info->stack->type);
@@ -2344,16 +2401,26 @@ tg_class_static_method_variant (void *p,
   method_name = strdup (info->stack->next->method);
   /* Stick the name of the method into its type.  */
   if (! substitute_type (info, info->stack->next->method))
   method_name = strdup (info->stack->next->method);
   /* Stick the name of the method into its type.  */
   if (! substitute_type (info, info->stack->next->method))
-    return FALSE;
+    {
+      free (method_name);
+      return FALSE;
+    }
 
   /* Get the type.  */
   method_type = pop_type (info);
   if (method_type == NULL)
 
   /* Get the type.  */
   method_type = pop_type (info);
   if (method_type == NULL)
-    return FALSE;
+    {
+      free (method_name);
+      return FALSE;
+    }
 
   /* Now the top of the stack is the class.  */
   if (! tg_fix_visibility (info, visibility))
 
   /* Now the top of the stack is the class.  */
   if (! tg_fix_visibility (info, visibility))
-    return FALSE;
+    {
+      free (method_type);
+      free (method_name);
+      return FALSE;
+    }
 
   fprintf (info->f, "%s\t%s\t0;\"\tkind:p\ttype:%s\tclass:%s\taccess:%s\n",
           method_name, info->filename, method_type, info->stack->type,
 
   fprintf (info->f, "%s\t%s\t0;\"\tkind:p\ttype:%s\tclass:%s\taccess:%s\n",
           method_name, info->filename, method_type, info->stack->type,
@@ -2474,7 +2541,7 @@ static bfd_boolean
 tg_int_constant (void *p, const char *name, bfd_vma val)
 {
   struct pr_handle *info = (struct pr_handle *) p;
 tg_int_constant (void *p, const char *name, bfd_vma val)
 {
   struct pr_handle *info = (struct pr_handle *) p;
-  char ab[20];
+  char ab[22];
 
   indent (info);
   print_vma (val, ab, FALSE, FALSE);
 
   indent (info);
   print_vma (val, ab, FALSE, FALSE);
@@ -2503,7 +2570,7 @@ tg_typed_constant (void *p, const char *name, bfd_vma val)
 {
   struct pr_handle *info = (struct pr_handle *) p;
   char *t;
 {
   struct pr_handle *info = (struct pr_handle *) p;
   char *t;
-  char ab[20];
+  char ab[22];
 
   t = pop_type (info);
   if (t == NULL)
 
   t = pop_type (info);
   if (t == NULL)
@@ -2526,25 +2593,18 @@ tg_variable (void *p, const char *name, enum debug_var_kind kind,
             bfd_vma val ATTRIBUTE_UNUSED)
 {
   struct pr_handle *info = (struct pr_handle *) p;
             bfd_vma val ATTRIBUTE_UNUSED)
 {
   struct pr_handle *info = (struct pr_handle *) p;
-  char *t;
-  const char *dname, *from_class;
+  char *t, *dname, *from_class;
 
   t = pop_type (info);
   if (t == NULL)
     return FALSE;
 
 
   t = pop_type (info);
   if (t == NULL)
     return FALSE;
 
-  dname = name;
+  dname = NULL;
   if (info->demangler)
   if (info->demangler)
-    {
-      dname = info->demangler (info->abfd, name);
-      if (strcmp (name, dname) == 0)
-       {
-         free ((char *) dname);
-         dname = name;
-       }
-    }
+    dname = info->demangler (info->abfd, name, demangle_flags);
 
 
-  if (dname != name)
+  from_class = NULL;
+  if (dname != NULL)
     {
       char *sep;
       sep = strstr (dname, "::");
     {
       char *sep;
       sep = strstr (dname, "::");
@@ -2555,14 +2615,9 @@ tg_variable (void *p, const char *name, enum debug_var_kind kind,
          from_class = dname;
        }
       else
          from_class = dname;
        }
       else
-       {
-         /* Obscure types as vts and type_info nodes.  */
-         name = dname;
-         from_class = NULL;
-       }
+       /* Obscure types as vts and type_info nodes.  */
+       name = dname;
     }
     }
-  else
-    from_class = NULL;
 
   fprintf (info->f, "%s\t%s\t0;\"\tkind:v\ttype:%s", name, info->filename, t);
 
 
   fprintf (info->f, "%s\t%s\t0;\"\tkind:v\ttype:%s", name, info->filename, t);
 
@@ -2580,10 +2635,10 @@ tg_variable (void *p, const char *name, enum debug_var_kind kind,
     }
 
   if (from_class)
     }
 
   if (from_class)
-    {
-      fprintf (info->f, "\tclass:%s",from_class);
-      free ((char *) dname);
-    }
+    fprintf (info->f, "\tclass:%s", from_class);
+
+  if (dname)
+    free (dname);
 
   fprintf (info->f, "\n");
 
 
   fprintf (info->f, "\n");
 
@@ -2598,28 +2653,22 @@ static bfd_boolean
 tg_start_function (void *p, const char *name, bfd_boolean global)
 {
   struct pr_handle *info = (struct pr_handle *) p;
 tg_start_function (void *p, const char *name, bfd_boolean global)
 {
   struct pr_handle *info = (struct pr_handle *) p;
-  const char *dname;
+  char *dname;
 
   if (! global)
     info->stack->flavor = "static";
   else
     info->stack->flavor = NULL;
 
 
   if (! global)
     info->stack->flavor = "static";
   else
     info->stack->flavor = NULL;
 
-  dname = name;
+  dname = NULL;
   if (info->demangler)
   if (info->demangler)
-    {
-      dname = info->demangler (info->abfd, name);
-      if (strcmp (name, dname) == 0)
-       {
-         free ((char *) dname);
-         dname = name;
-       }
-    }
+    dname = info->demangler (info->abfd, name, demangle_flags);
 
 
-  if (! substitute_type (info, dname))
+  if (! substitute_type (info, dname ? dname : name))
     return FALSE;
 
     return FALSE;
 
-  if (dname != name)
+  info->stack->method = NULL;
+  if (dname != NULL)
     {
       char *sep;
       sep = strstr (dname, "::");
     {
       char *sep;
       sep = strstr (dname, "::");
@@ -2639,8 +2688,6 @@ tg_start_function (void *p, const char *name, bfd_boolean global)
        *sep = 0;
       /* Obscure functions as type_info function.  */
     }
        *sep = 0;
       /* Obscure functions as type_info function.  */
     }
-  else
-    info->stack->method = NULL;
 
   info->stack->parents = strdup (name);
 
 
   info->stack->parents = strdup (name);
 
@@ -2701,7 +2748,7 @@ static bfd_boolean
 tg_start_block (void *p, bfd_vma addr)
 {
   struct pr_handle *info = (struct pr_handle *) p;
 tg_start_block (void *p, bfd_vma addr)
 {
   struct pr_handle *info = (struct pr_handle *) p;
-  char ab[20], kind, *partof;
+  char ab[22], kind, *partof;
   char *t;
   bfd_boolean local;
 
   char *t;
   bfd_boolean local;
 
@@ -2748,7 +2795,7 @@ tg_start_block (void *p, bfd_vma addr)
 /* Write out line number information.  */
 
 static bfd_boolean
 /* Write out line number information.  */
 
 static bfd_boolean
-tg_lineno (void *p ATTRIBUTE_UNUSED, const char *filename ATTRIBUTE_UNUSED,
+tg_lineno (void *p ATTRIBUTE_UNUSED, const char *fname ATTRIBUTE_UNUSED,
           unsigned long lineno ATTRIBUTE_UNUSED,
           bfd_vma addr ATTRIBUTE_UNUSED)
 {
           unsigned long lineno ATTRIBUTE_UNUSED,
           bfd_vma addr ATTRIBUTE_UNUSED)
 {
This page took 0.038945 seconds and 4 git commands to generate.