From: dlong@cse.ucsc.EDU (Dean R. E. Long)
Subject: gdb-4.7 patches
Organization: GNUs Not Usenet
Distribution: gnu
Date: Sat, 9 Jan 1993 17:51:05 GMT

These patches fix a number of demangling bugs related to templates.

dl

-------------
*** gdb/symtab.c.orig	Fri Oct  9 09:44:31 1992
--- gdb/symtab.c	Fri Jan  8 22:48:48 1993
***************
*** 2490,2501 ****
    int newsize;
    int i;
  
-   /* clip symbols that cannot match */
- 
-   if (!cplus_match (symname, text, text_len)) {
-     return;
-   }
- 
    /* matches mangled, may match unmangled.  now clip any symbol names
       that we've already considered.  (This is a time optimization)  */
  
--- 2490,2495 ----
***************
*** 2516,2521 ****
--- 2510,2521 ----
  
        symname = demangled;
      } else {
+       /* clip symbols that cannot match */
+ 
+       if (!cplus_match (symname, text, text_len)) {
+ 	return;
+       }
+ 
        symname = savestring (symname, strlen (symname));
      }
  
*** libiberty/cplus-dem.c.orig	Mon Oct  5 17:42:45 1992
--- libiberty/cplus-dem.c	Sun Jan 10 01:42:17 1993
***************
*** 276,285 ****
  static void
  forget_types PARAMS ((struct work_stuff *));
  
- #if 0
  static void
  string_prepends PARAMS ((string *, string *));
- #endif
  
  /*  Translate count to integer, consuming tokens in the process.
      Conversion terminates on the first non-digit character. */
--- 276,283 ----
***************
*** 669,675 ****
      }
    string_appendn (&tname, *mangled, r);
    string_appendn (&trawname, *mangled, r);
-   string_appendn (&trawname, "", 1);
    *mangled += r;
    string_append (&tname, "<");
    /* get size of template parameter list */
--- 667,672 ----
***************
*** 688,697 ****
  	{
  	  (*mangled)++;
  	  success = do_type (work, mangled, &temp);
- 	  string_appendn (&temp, "", 1);
  	  if (success)
  	    {
! 	      string_append (&tname, temp.b);
  	    }
  	  string_delete(&temp);
  	  if (!success)
--- 685,693 ----
  	{
  	  (*mangled)++;
  	  success = do_type (work, mangled, &temp);
  	  if (success)
  	    {
! 	      string_appends (&tname, temp);
  	    }
  	  string_delete(&temp);
  	  if (!success)
***************
*** 708,717 ****
  	  is_integral = 0;
  	  done = 0;
  	  success = do_type (work, mangled, &temp);
- 	  string_appendn (&temp, "", 1);
  	  if (success)
  	    {
! 	      string_append (&tname, temp.b);
  	    }
  	  string_delete(&temp);
  	  if (!success)
--- 704,712 ----
  	  is_integral = 0;
  	  done = 0;
  	  success = do_type (work, mangled, &temp);
  	  if (success)
  	    {
! 	      string_appends (&tname, temp);
  	    }
  	  string_delete(&temp);
  	  if (!success)
***************
*** 825,832 ****
      }
    if (work -> constructor || work -> destructor)
      {
!       string_append (&tname, trawname.b);
      }
    string_delete(&trawname);
    
    if (!success)
--- 820,833 ----
      }
    if (work -> constructor || work -> destructor)
      {
!       string_appends (&tname, trawname);
      }
+   {
+     char buf[16];
+     sprintf(buf, "%d", trawname.p - trawname.b);
+     string_prepend(&trawname, buf);
+     remember_type(work, trawname.b, trawname.p - trawname.b);
+   }
    string_delete(&trawname);
    
    if (!success)
***************
*** 835,841 ****
      }
    else
      {
!       string_prepend (declp, tname.b);
        string_delete (&tname);
        
        if (work -> static_type)
--- 836,842 ----
      }
    else
      {
!       string_prepends (declp, tname);
        string_delete (&tname);
        
        if (work -> static_type)
***************
*** 842,853 ****
  	{
  	  string_append (declp, *mangled + 1);
  	  *mangled += strlen (*mangled);
- 	  success = 1;
  	}
!       else
! 	{
! 	  success = demangle_args (work, mangled, declp);
! 	}
      }
    return (success);
  }
--- 843,850 ----
  	{
  	  string_append (declp, *mangled + 1);
  	  *mangled += strlen (*mangled);
  	}
!       success = 1;
      }
    return (success);
  }
***************
*** 993,1001 ****
  	  success = 0;
  	}
      }
!   else if ((scan == *mangled) && (isdigit (scan[2]) || (scan[2] == 'Q')))
      {
!       /* A GNU style constructor starts with "__<digit>" or "__Q". */
        work -> constructor = 1;
        *mangled = scan + 2;
      }
--- 990,998 ----
  	  success = 0;
  	}
      }
!   else if ((scan == *mangled) && (isdigit (scan[2]) || (scan[2] == 't')))
      {
!       /* A GNU style constructor starts with "__<digit>" or "__t". */
        work -> constructor = 1;
        *mangled = scan + 2;
      }
***************
*** 2164,2171 ****
      }
  }
  
- #if 0
- 
  static void
  string_prepends (p, s)
       string *p, *s;
--- 2161,2166 ----
***************
*** 2175,2182 ****
        string_prependn (p, s->b, s->p - s->b);
      }
  }
- 
- #endif
  
  static void
  string_prependn (p, s, n)
--- 2170,2175 ----

Newsgroups: gnu.gdb.bug