From: pfieland@cyclonic.sw.stratus.com (Peggy Fieland)
Subject: (none)
Organization: GNUs Not Usenet
Distribution: gnu
Date: Wed, 12 Aug 1992 19:32:15 GMT

FOr gdb-4.6 (On a Sun Sparc or Stratus FTX2 (i860)),
when demangling style is set to cfront, gdb does
not properly demangle member functions whose parameters
have the same type  -- but it is correct for these
types of functions when they are not member functions.

The problem is that cfront uses a one-based numbering scheme
for non-member function parameters , but a zero -based one
for member functions -- ie, it is necessary to know
if the function is a member function in order to properly
demangle it's parameters.

Here is a test program:

  class complex
      {
      double r;
      double i;
      public:
              complex(){};
              complex(double x,double y); 
          long funny_name_ (long l);

      };

long complex::funny_name_ (long l)
{
 return l;
}

 complex::complex(double x, double y)
{
r=x; 
i=y;

}
long plus (long l, long m)
{
 return (l + m);
}

main()
{

complex cc;

}

Here is a sample debugging session:
GDB is free software and you are welcome to distribute copies of it
 under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.6, Copyright 1992 Free Software Foundation, Inc...
(gdb) set demangle-style cfront
(gdb)  maintenance demangle __ct__7complexFdT1
complex::complex(double, complex)
(gdb) set print demangle off
(gdb) info functions plus
All functions matching regular expression "plus":

File complex.c:
int plus__FlT1();
(gdb) maintenance demangle plus__FlT1
plus(long, long)
(gdb) info functions complex
All functions matching regular expression "complex":

File complex.c:
struct complex *__ct__7complexFdT1();
int funny_name___7complexFl();
(gdb) q
 
Here is a fix:


*** /home/tools/gnu/gdb-4.6/gdb/cplus-dem.c	Tue Jul 14 03:34:20 1992
--- cplus-dem.c	Mon Aug 10 09:58:32 1992
***************
*** 57,67 ****
    int destructor;
    int static_type;	/* A static member function */
    int const_type;	/* A const member function */
  };
  
  #define PRINT_ANSI_QUALIFIERS (work -> options & DMGL_ANSI)
  #define PRINT_ARG_TYPES       (work -> options & DMGL_PARAMS)
! 
  static const struct optable
  {
    const char *in;
--- 61,72 ----
    int destructor;
    int static_type;	/* A static member function */
    int const_type;	/* A const member function */
+   int is_in_class; /* is a member function of a class */
  };
  
  #define PRINT_ANSI_QUALIFIERS (work -> options & DMGL_ANSI)
  #define PRINT_ARG_TYPES       (work -> options & DMGL_PARAMS)

  static const struct optable
  {
    const char *in;
***************
*** 465,470 ****
--- 473,479 ----
  	    if (success)
  	      {
  		remember_type (premangle, *mangled - premangle, work);
+           work -> is_in_class = 1;
  	      }
  #endif
  	    if (current_demangling_style == auto_demangling ||
***************
*** 1585,1591 ****
  	      return (0);
  	    }
  	  if (current_demangling_style == lucid_demangling ||
! 	      current_demangling_style == cfront_demangling)
  	    {
  	      t--;
  	    }
--- 1693,1699 ----
  	      return (0);
  	    }
  	  if (current_demangling_style == lucid_demangling ||
! 	      ((current_demangling_style == cfront_demangling) && (work -> is_in_class== 0)))
  	    {
  	      t--;
  	    }


Newsgroups: gnu.gdb.bug