* utils.c (fputs_demangled): Complete rewrite to clean up and
authorFred Fish <fnf@specifix.com>
Thu, 11 Mar 1993 17:44:39 +0000 (17:44 +0000)
committerFred Fish <fnf@specifix.com>
Thu, 11 Mar 1993 17:44:39 +0000 (17:44 +0000)
add a language parameter that is used to select the demangling
algorithm.
* defs.h (enum language):  Move further up in file so enum can
be used in prototypes.
* defs.h (fputs_demangled):  Update prototype to add lang arg.
* c-typeprint.c (cp_type_print_method_args):  Add language arg
to fputs_demangled calls, remove DMGL_PARAMS flag.
* stack.c (print_frame_info):  Remove obsolete code so we don't
have to update fputs_demangled usage in it.
* stack.c (print_frame_info, frame_info):  Add language variable
to pass to fputs_demangled and initialize it from the symbol's
language.  Call fputs_demangled with language arg.
* symtab.c (find_methods):  Add language arg to fputs_demangled
call.

gdb/ChangeLog
gdb/c-typeprint.c
gdb/defs.h
gdb/stack.c
gdb/symtab.c
gdb/utils.c

index 942102c..cbc0a08 100644 (file)
@@ -1,3 +1,21 @@
+Thu Mar 11 09:33:01 1993  Fred Fish  (fnf@cygnus.com)
+
+       * utils.c (fputs_demangled):  Complete rewrite to clean up and
+       add a language parameter that is used to select the demangling
+       algorithm.
+       * defs.h (enum language):  Move further up in file so enum can
+       be used in prototypes.
+       * defs.h (fputs_demangled):  Update prototype to add lang arg.
+       * c-typeprint.c (cp_type_print_method_args):  Add language arg
+       to fputs_demangled calls, remove DMGL_PARAMS flag.
+       * stack.c (print_frame_info):  Remove obsolete code so we don't
+       have to update fputs_demangled usage in it.
+       * stack.c (print_frame_info, frame_info):  Add language variable
+       to pass to fputs_demangled and initialize it from the symbol's
+       language.  Call fputs_demangled with language arg.
+       * symtab.c (find_methods):  Add language arg to fputs_demangled
+       call.
+
 Wed Mar 10 17:37:11 1993  Fred Fish  (fnf@cygnus.com)
 
        * Makefile.in (VERSION):  Bump version to 4.8.2.
index 1740a06..16123af 100644 (file)
@@ -151,8 +151,8 @@ cp_type_print_method_args (args, prefix, varstring, staticp, stream)
 {
   int i;
 
-  fputs_demangled (prefix, stream, DMGL_ANSI | DMGL_PARAMS);
-  fputs_demangled (varstring, stream, DMGL_ANSI | DMGL_PARAMS);
+  fputs_demangled (prefix, stream, DMGL_ANSI, language_cplus);
+  fputs_demangled (varstring, stream, DMGL_ANSI, language_cplus);
   fputs_filtered (" (", stream);
   if (args && args[!staticp] && args[!staticp]->code != TYPE_CODE_VOID)
     {
index 283b589..9c13881 100644 (file)
@@ -36,7 +36,7 @@ typedef unsigned int CORE_ADDR;
 /* Gdb does *lots* of string compares.  Use macros to speed them up by
    avoiding function calls if the first characters are not the same. */
 
-#define STRCMP(a,b) (*(a) == *(b) ? strcmp ((a), (b)) : *(a) - *(b))
+#define STRCMP(a,b) (*(a) == *(b) ? strcmp ((a), (b)) : (int)*(a) - (int)*(b))
 #define STREQ(a,b) (*(a) == *(b) ? !strcmp ((a), (b)) : 0)
 #define STREQN(a,b,c) (*(a) == *(b) ? !strncmp ((a), (b), (c)) : 0)
 
@@ -72,6 +72,23 @@ enum command_class
   class_pseudo
 };
 
+/* Languages represented in the symbol table and elsewhere.
+   This should probably be in language.h, but since enum's can't
+   be forward declared to satisfy opaque references before their
+   actual definition, needs to be here. */
+
+enum language 
+{
+   language_unknown,           /* Language not known */
+   language_auto,              /* Placeholder for automatic setting */
+   language_c,                         /* C */
+   language_cplus,             /* C++ */
+                               /* start-sanitize-chill */
+   language_chill,             /* Chill */
+                               /* end-sanitize-chill */
+   language_m2                 /* Modula-2 */
+};
+
 /* the cleanup list records things that have to be undone
    if an error happens (descriptors to be closed, memory to be freed, etc.)
    Each link in the chain records a function to call and an
@@ -247,7 +264,7 @@ extern void
 fprint_symbol PARAMS ((FILE *, char *));
 
 extern void
-fputs_demangled PARAMS ((char *, FILE *, int));
+fputs_demangled PARAMS ((char *, FILE *, int, enum language));
 
 extern void
 perror_with_name PARAMS ((char *));
@@ -349,23 +366,6 @@ extern unsigned output_radix;
 /* Baud rate specified for communication with serial target systems.  */
 extern char *baud_rate;
 
-/* Languages represented in the symbol table and elsewhere.
-   This should probably be in language.h, but since enum's can't
-   be forward declared to satisfy opaque references before their
-   actual definition, needs to be here. */
-
-enum language 
-{
-   language_unknown,           /* Language not known */
-   language_auto,              /* Placeholder for automatic setting */
-   language_c,                         /* C */
-   language_cplus,             /* C++ */
-                               /* start-sanitize-chill */
-   language_chill,             /* Chill */
-                               /* end-sanitize-chill */
-   language_m2                 /* Modula-2 */
-};
-
 /* Possibilities for prettyprint parameters to routines which print
    things.  Like enum language, this should be in value.h, but needs
    to be here for the same reason.  FIXME:  If we can eliminate this
@@ -538,6 +538,17 @@ enum val_prettyprint
 # endif
 #endif
 
+/* If we picked up a copy of CHAR_BIT from a configuration file
+   (which may get it by including <limits.h>) then use it to set
+   the number of bits in a host char.  If not, use the same size
+   as the target. */
+
+#if defined (CHAR_BIT)
+#define HOST_CHAR_BIT CHAR_BIT
+#else
+#define HOST_CHAR_BIT TARGET_CHAR_BIT
+#endif
+
 /* Assorted functions we can declare, now that const and volatile are 
    defined.  */
 
index a8037c4..e9757d0 100644 (file)
@@ -1,5 +1,5 @@
 /* Print and select stack frames for GDB, the GNU debugger.
-   Copyright (C) 1986, 1987, 1989, 1991 Free Software Foundation, Inc.
+   Copyright 1986, 1987, 1989, 1991, 1992, 1993 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -139,33 +139,9 @@ print_frame_info (fi, level, source, args)
   struct symtab_and_line sal;
   struct symbol *func;
   register char *funname = 0;
+  enum language funlang = language_unknown;
   int numargs;
 
-#if 0  /* Symbol reading is fast enough now */
-  struct partial_symtab *pst;
-
-  /* Don't give very much information if we haven't readin the
-     symbol table yet.  */
-  pst = find_pc_psymtab (fi->pc);
-  if (pst && !pst->readin)
-    {
-      /* Abbreviated information.  */
-      char *fname;
-
-      if (!find_pc_partial_function (fi->pc, &fname, 0))
-       fname = "??";
-       
-      printf_filtered ("#%-2d ", level);
-      if (addressprint)
-        printf_filtered ("%s in ", local_hex_string(fi->pc));
-
-      fputs_demangled (fname, stdout, 0);
-      fputs_filtered (" (...)\n", stdout);
-      
-      return;
-    }
-#endif
-
 #ifdef CORE_NEEDS_RELOCATION
   CORE_NEEDS_RELOCATION(fi->pc);
 #endif
@@ -190,7 +166,7 @@ print_frame_info (fi, level, source, args)
 
       struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
       if (msymbol != NULL
-         && (msymbol -> address
+         && (SYMBOL_VALUE_ADDRESS (msymbol) 
              > BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
        {
          /* In this case we have no way of knowing the source file
@@ -199,16 +175,23 @@ print_frame_info (fi, level, source, args)
          /* We also don't know anything about the function besides
             its address and name.  */
          func = 0;
-         funname = msymbol -> name;
+         funname = SYMBOL_NAME (msymbol);
+         funlang = SYMBOL_LANGUAGE (msymbol);
        }
       else
-       funname = SYMBOL_NAME (func);
+       {
+         funname = SYMBOL_NAME (func);
+         funlang = SYMBOL_LANGUAGE (func);
+       }
     }
   else
     {
       register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
       if (msymbol != NULL)
-       funname = msymbol -> name;
+       {
+         funname = SYMBOL_NAME (msymbol);
+         funlang = SYMBOL_LANGUAGE (msymbol);
+       }
     }
 
   if (source >= 0 || !sal.symtab)
@@ -218,7 +201,7 @@ print_frame_info (fi, level, source, args)
       if (addressprint)
        if (fi->pc != sal.pc || !sal.symtab)
          printf_filtered ("%s in ", local_hex_string(fi->pc));
-      fputs_demangled (funname ? funname : "??", stdout, 0);
+      fputs_demangled (funname ? funname : "??", stdout, 0, funlang);
       wrap_here ("   ");
       fputs_filtered (" (", stdout);
       if (args)
@@ -265,10 +248,6 @@ print_frame_info (fi, level, source, args)
   fflush (stdout);
 }
 
-#ifdef FRAME_SPECIFICATION_DYADIC
-extern FRAME setup_arbitrary_frame ();
-#endif
-
 /*
  * Read a frame specification in whatever the appropriate format is.
  * Call error() if the specification is in any way invalid (i.e.
@@ -279,7 +258,9 @@ parse_frame_specification (frame_exp)
      char *frame_exp;
 {
   int numargs = 0;
-  int arg1, arg2;
+  int arg1, arg2, arg3;
+#define        MAXARGS 4
+  int args[MAXARGS];
   
   if (frame_exp)
     {
@@ -287,27 +268,25 @@ parse_frame_specification (frame_exp)
       struct cleanup *tmp_cleanup;
 
       while (*frame_exp == ' ') frame_exp++;
-      for (p = frame_exp; *p && *p != ' '; p++)
-       ;
 
-      if (*frame_exp)
+      while (*frame_exp)
        {
-         numargs = 1;
+         if (numargs > MAXARGS)
+           error ("Too many args in frame specification");
+         /* Parse an argument.  */
+          for (p = frame_exp; *p && *p != ' '; p++)
+           ;
          addr_string = savestring(frame_exp, p - frame_exp);
 
          {
            tmp_cleanup = make_cleanup (free, addr_string);
-           arg1 = parse_and_eval_address (addr_string);
+           args[numargs++] = parse_and_eval_address (addr_string);
            do_cleanups (tmp_cleanup);
          }
 
+         /* Skip spaces, move to possible next arg.  */
          while (*p == ' ') p++;
-         
-         if (*p)
-           {
-             numargs = 2;
-             arg2 = parse_and_eval_address (p);
-           }
+         frame_exp = p;
        }
     }
 
@@ -320,7 +299,7 @@ parse_frame_specification (frame_exp)
       /* NOTREACHED */
     case 1:
       {
-       int level = arg1;
+       int level = args[0];
        FRAME fid = find_relative_frame (get_current_frame (), &level);
        FRAME tfid;
 
@@ -332,35 +311,33 @@ parse_frame_specification (frame_exp)
           (s)he gets.  Still, give the highest one that matches.  */
 
        for (fid = get_current_frame ();
-            fid && FRAME_FP (fid) != arg1;
+            fid && FRAME_FP (fid) != args[0];
             fid = get_prev_frame (fid))
          ;
 
        if (fid)
          while ((tfid = get_prev_frame (fid)) &&
-                (FRAME_FP (tfid) == arg1))
+                (FRAME_FP (tfid) == args[0]))
            fid = tfid;
          
-#ifdef FRAME_SPECIFICATION_DYADIC
-       if (!fid)
-         error ("Incorrect number of args in frame specification");
-
-       return fid;
-#else
-       return create_new_frame (arg1, 0);
-#endif
+       /* We couldn't identify the frame as an existing frame, but
+          perhaps we can create one with a single argument.
+          Fall through to default case; it's up to SETUP_ARBITRARY_FRAME
+          to complain if it doesn't like a single arg.  */
       }
-      /* NOTREACHED */
-    case 2:
-      /* Must be addresses */
-#ifndef FRAME_SPECIFICATION_DYADIC
-      error ("Incorrect number of args in frame specification");
+
+     default:
+#ifdef SETUP_ARBITRARY_FRAME
+      return SETUP_ARBITRARY_FRAME (numargs, args);
 #else
-      return setup_arbitrary_frame (arg1, arg2);
+      /* Usual case.  Do it here rather than have everyone supply
+        a SETUP_ARBITRARY_FRAME that does this.  */
+      if (numargs == 1)
+       return create_new_frame (args[0], 0);
+      error ("Too many args in frame specification");
 #endif
       /* NOTREACHED */
     }
-  fatal ("Internal: Error in parsing in parse_frame_specification");
   /* NOTREACHED */
 }
 
@@ -391,6 +368,7 @@ frame_info (addr_exp, from_tty)
   FRAME calling_frame;
   int i, count;
   char *funname = 0;
+  enum language funlang = language_unknown;
 
   if (!target_has_stack)
     error ("No inferior or core file.");
@@ -404,12 +382,18 @@ frame_info (addr_exp, from_tty)
   func = get_frame_function (frame);
   s = find_pc_symtab(fi->pc);
   if (func)
-    funname = SYMBOL_NAME (func);
+    {
+      funname = SYMBOL_NAME (func);
+      funlang = SYMBOL_LANGUAGE (func);
+    }
   else
     {
       register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
       if (msymbol != NULL)
-       funname = msymbol -> name;
+       {
+         funname = SYMBOL_NAME (msymbol);
+         funlang = SYMBOL_LANGUAGE (msymbol);
+       }
     }
   calling_frame = get_prev_frame (frame);
 
@@ -429,7 +413,7 @@ frame_info (addr_exp, from_tty)
   if (funname)
     {
       printf_filtered (" in ");
-      fputs_demangled (funname, stdout, DMGL_ANSI | DMGL_PARAMS);
+      fputs_demangled (funname, stdout, DMGL_ANSI | DMGL_PARAMS, funlang);
     }
   wrap_here ("   ");
   if (sal.symtab)
@@ -461,6 +445,10 @@ frame_info (addr_exp, from_tty)
   if (s)
      printf_filtered(" source language %s.\n", language_str(s->language));
 
+#ifdef PRINT_EXTRA_FRAME_INFO
+  PRINT_EXTRA_FRAME_INFO (fi);
+#endif
+
   {
     /* Address of the argument list for this frame, or 0.  */
     CORE_ADDR arg_list = FRAME_ARGS_ADDRESS_CORRECT (fi);
@@ -666,7 +654,7 @@ print_block_frame_locals (b, frame, stream)
          || SYMBOL_CLASS (sym) == LOC_STATIC)
        {
          values_printed = 1;
-         fprint_symbol (stream, SYMBOL_NAME (sym));
+         fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
          fputs_filtered (" = ", stream);
          print_variable_value (sym, frame, stream);
          fprintf_filtered (stream, "\n");
@@ -693,7 +681,7 @@ print_block_frame_labels (b, have_default, stream)
   for (i = 0; i < nsyms; i++)
     {
       sym = BLOCK_SYM (b, i);
-      if (! strcmp (SYMBOL_NAME (sym), "default"))
+      if (STREQ (SYMBOL_NAME (sym), "default"))
        {
          if (*have_default)
            continue;
@@ -704,7 +692,7 @@ print_block_frame_labels (b, have_default, stream)
          struct symtab_and_line sal;
          sal = find_pc_line (SYMBOL_VALUE_ADDRESS (sym), 0);
          values_printed = 1;
-         fputs_demangled (SYMBOL_NAME (sym), stream, DMGL_ANSI | DMGL_PARAMS);
+         fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
          if (addressprint)
            fprintf_filtered (stream, " %s", 
                              local_hex_string(SYMBOL_VALUE_ADDRESS (sym)));
@@ -879,7 +867,7 @@ print_frame_arg_vars (frame, stream)
          || SYMBOL_CLASS (sym) == LOC_REGPARM)
        {
          values_printed = 1;
-         fprint_symbol (stream, SYMBOL_NAME (sym));
+         fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
          fputs_filtered (" = ", stream);
          /* We have to look up the symbol because arguments often have
             two entries (one a parameter, one a register) and the one
@@ -1127,8 +1115,6 @@ return_command (retval_exp, from_tty)
   FRAME_ADDR selected_frame_addr;
   CORE_ADDR selected_frame_pc;
   FRAME frame;
-  char *funcname;
-  struct cleanup *back_to;
   value return_value;
 
   if (selected_frame == NULL)
@@ -1153,14 +1139,11 @@ return_command (retval_exp, from_tty)
     {
       if (thisfun != 0)
        {
-         funcname = strdup_demangled (SYMBOL_NAME (thisfun));
-         back_to = make_cleanup (free, funcname);
-         if (!query ("Make %s return now? ", funcname))
+         if (!query ("Make %s return now? ", SYMBOL_SOURCE_NAME (thisfun)))
            {
              error ("Not confirmed.");
              /* NOTREACHED */
            }
-         do_cleanups (back_to);
        }
       else
        if (!query ("Make selected stack frame return now? "))
index 328679c..c31d7b6 100644 (file)
@@ -1389,7 +1389,8 @@ find_methods (t, name, sym_arr)
                else
                  {
                    fputs_filtered("(Cannot find method ", stdout);
-                   fputs_demangled(phys_name, stdout, DMGL_PARAMS);
+                   fputs_demangled(phys_name, stdout, DMGL_PARAMS,
+                                   language_cplus);
                    fputs_filtered(" - possibly inlined.)\n", stdout);
                  }
              }
index a941454..895a62a 100644 (file)
@@ -33,6 +33,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "bfd.h"
 #include "target.h"
 #include "demangle.h"
+#include "expression.h"
+#include "language.h"
 
 /* Prototypes for local functions */
 
@@ -411,9 +413,33 @@ quit ()
 #else
   error ("Quit (expect signal %d when inferior is resumed)", SIGINT);
 #endif /* TIOCGPGRP */
+#else
+  error ("Quit");
 #endif
 }
 
+
+#ifdef __GO32__
+
+/* In the absence of signals, poll keyboard for a quit.
+   Called from #define QUIT pollquit() in xm-go32.h. */
+
+void
+pollquit()
+{
+  if (kbhit ())
+    {
+      int k = getkey ();
+      if (k == 1)
+       quit_flag = 1;
+      else if (k == 2)
+       immediate_quit = 1;
+      quit ();
+    }
+}
+
+#endif
+
 /* Control C comes here */
 
 void
@@ -1110,71 +1136,50 @@ fputs_filtered (linebuffer, stream)
 }
 
 
-/* fputs_demangled is a variant of fputs_filtered that
-   demangles g++ names.*/
+/* fputs_demangled attempts to demangle NAME, a symbol in language LANG, using
+   demangling args ARG_MODE, and print it filtered to STREAM.  If the name is
+   not mangled, or the language for the name is unknown, or demangling is off,
+   the name is printed in its "raw" form. */
 
 void
-fputs_demangled (linebuffer, stream, arg_mode)
-     char *linebuffer;
+fputs_demangled (name, stream, arg_mode, lang)
+     char *name;
      FILE *stream;
      int arg_mode;
+     enum language lang;
 {
-#define SYMBOL_MAX 1024
-
-#define SYMBOL_CHAR(c) (isascii(c) \
-  && (isalnum(c) || (c) == '_' || (c) == CPLUS_MARKER))
-
-  char buf[SYMBOL_MAX+1];
-# define DMSLOP 5              /* How much room to leave in buf */
-  char *p;
-
-  if (linebuffer == NULL)
-    return;
-
-  /* If user wants to see raw output, no problem.  */
-  if (!demangle) {
-    fputs_filtered (linebuffer, stream);
-    return;
-  }
-
-  p = linebuffer;
-
-  while ( *p != (char) 0 ) {
-    int i = 0;
-
-    /* collect non-interesting characters into buf */
-    while (*p != (char) 0 && !SYMBOL_CHAR(*p) && i < (int)sizeof(buf)-DMSLOP ) {
-      buf[i++] = *p;
-      p++;
-    }
-    if (i > 0) {
-      /* output the non-interesting characters without demangling */
-      buf[i] = (char) 0;
-      fputs_filtered(buf, stream);
-      i = 0;  /* reset buf */
-    }
+  char *demangled;
 
-    /* and now the interesting characters */
-    while (i < SYMBOL_MAX
-     && *p != (char) 0
-     && SYMBOL_CHAR(*p)
-     && i < (int)sizeof(buf) - DMSLOP) {
-      buf[i++] = *p;
-      p++;
-    }
-    buf[i] = (char) 0;
-    if (i > 0) {
-      char * result;
-      
-      if ( (result = cplus_demangle(buf, arg_mode)) != NULL ) {
-       fputs_filtered(result, stream);
-       free(result);
-      }
-      else {
-       fputs_filtered(buf, stream);
-      }
+  if (name != NULL)
+    {
+      /* If user wants to see raw output, no problem.  */
+      if (!demangle)
+       {
+         fputs_filtered (name, stream);
+       }
+      else
+       {
+         switch (lang)
+           {
+           case language_cplus:
+             demangled = cplus_demangle (name, arg_mode);
+             break;
+             /* start-sanitize-chill */
+           case language_chill:
+             demangled = chill_demangle (name);
+             break;
+             /* end-sanitize-chill */
+           default:
+             demangled = NULL;
+             break;
+           }
+         fputs_filtered (demangled ? demangled : name, stream);
+         if (demangled != NULL)
+           {
+             free (demangled);
+           }
+       }
     }
-  }
 }
 
 /* Print a variable number of ARGS using format FORMAT.  If this
@@ -1361,34 +1366,34 @@ print_spaces_filtered (n, stream)
 \f
 /* C++ demangler stuff.  */
 
-/* Make a copy of a symbol, applying C++ demangling if demangling is enabled
-   and a demangled version exists.  Note that the value returned from
-   cplus_demangle is already allocated in malloc'd memory. */
-
-char *
-strdup_demangled (name)
-     const char *name;
-{
-  char *demangled = NULL;
-
-  if (demangle)
-    {
-      demangled = cplus_demangle (name, DMGL_PARAMS | DMGL_ANSI);
-    }
-  return ((demangled != NULL) ? demangled : strdup (name));
-}
-
-
 /* Print NAME on STREAM, demangling if necessary.  */
 void
 fprint_symbol (stream, name)
      FILE *stream;
      char *name;
 {
-  char *demangled;
-  if ((!demangle)
-      || NULL == (demangled = cplus_demangle (name, DMGL_PARAMS | DMGL_ANSI)))
-    fputs_filtered (name, stream);
+  char *demangled = NULL;
+
+  if (demangle)
+    {
+      /* Lacking a better method of knowing what demangler to use, pick
+        one appropriate for whatever the current language is.  (FIXME) */
+      switch (current_language -> la_language)
+       {
+         case language_cplus:
+           demangled = cplus_demangle (name, DMGL_PARAMS | DMGL_ANSI);
+           break;
+         /* start-sanitize-chill */
+         case language_chill:
+           demangled = chill_demangle (name);
+           break;
+         /* end-sanitize-chill */
+       }
+    }
+  if (demangled == NULL)
+    {
+      fputs_filtered (name, stream);
+    }
   else
     {
       fputs_filtered (demangled, stream);
@@ -1534,3 +1539,4 @@ _initialize_utils ()
 #ifdef  SIGWINCH_HANDLER_BODY
         SIGWINCH_HANDLER_BODY
 #endif
+