4.4BSD/usr/src/contrib/gdb-4.7.lbl/gdb/gcc.patch

Recent versions of gcc have had a bug in how they emit debugging
information for C++ methods (when using dbx-style stabs).
This patch should fix the problem.  Fix you can't fix gcc,
you can alternatively define GCC_MANGLE_BUG when compling gdb/symtab.c.

===================================================================
RCS file: /rel/cvsfiles/devo/gcc/dbxout.c,v
retrieving revision 1.53
diff -c -r1.53 dbxout.c
*** 1.53	1992/07/05 09:50:22
--- dbxout.c	1992/07/09 07:00:33
***************
*** 683,688 ****
--- 683,689 ----
    tree type_encoding;
    register tree fndecl;
    register tree last;
+   char formatted_type_identifier_length[16];
    register int type_identifier_length;
  
    if (methods == NULL_TREE)
***************
*** 711,716 ****
--- 712,719 ----
  
    type_identifier_length = IDENTIFIER_LENGTH (type_encoding);
  
+   sprintf(formatted_type_identifier_length, "%d", type_identifier_length);
+ 
    if (TREE_CODE (methods) == FUNCTION_DECL)
      fndecl = methods;
    else if (TREE_VEC_ELT (methods, 0) != NULL_TREE)
***************
*** 754,762 ****
--- 757,769 ----
  		  if (debug_name[0] == '_' && debug_name[1] == '_')
  		    {
  		      char *method_name = debug_name + 2;
+ 		      char *length_ptr = formatted_type_identifier_length;
  		      /* Get past const and volatile qualifiers.  */
  		      while (*method_name == 'C' || *method_name == 'V')
  			method_name++;
+ 		      /* Skip digits for length of type_encoding. */
+ 		      while (*method_name == *length_ptr && *length_ptr)
+ 			  length_ptr++, method_name++;
  		      if (! strncmp (method_name,
  				     IDENTIFIER_POINTER (type_encoding),
  				     type_identifier_length))
***************
*** 768,775 ****
--- 775,786 ----
  	      else if (debug_name[0] == '_' && debug_name[1] == '_')
  		{
  		  char *ctor_name = debug_name + 2;
+ 		  char *length_ptr = formatted_type_identifier_length;
  		  while (*ctor_name == 'C' || *ctor_name == 'V')
  		    ctor_name++;
+ 		  /* Skip digits for length of type_encoding. */
+ 		  while (*ctor_name == *length_ptr && *length_ptr)
+ 		      length_ptr++, ctor_name++;
  		  if (!strncmp (IDENTIFIER_POINTER (type_encoding), ctor_name,
  				type_identifier_length))
  		    debug_name = ctor_name + type_identifier_length;