* ld-srec/srec.exp: Add setup_xfail for i960 COFF targets.
[deliverable/binutils-gdb.git] / gdb / c-typeprint.c
index 8d72838407afd451bf4f15b418d1255debaa7040..af61d8a9ffbb7b997ee453e80c0178094e7b3617 100644 (file)
@@ -1,5 +1,6 @@
 /* Support for printing C and C++ types for GDB, the GNU debugger.
-   Copyright 1986, 1988, 1989, 1991 Free Software Foundation, Inc.
+   Copyright 1986, 1988, 1989, 1991, 1993, 1994
+   Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -15,7 +16,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
 #include "obstack.h"
@@ -33,10 +34,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "c-lang.h"
 #include "typeprint.h"
 
-#include <string.h>
+#include "gdb_string.h"
 #include <errno.h>
-
-extern int demangle;   /* whether to print C++ syms raw or source-form */
+#include <ctype.h>
 
 static void
 c_type_print_args PARAMS ((struct type *, GDB_FILE *));
@@ -89,7 +89,14 @@ c_typedef_print (type, new, stream)
 #endif
 #ifdef _LANG_chill
    case language_chill:
-      error ("Missing Chill support in function c_typedef_print."); /*FIXME*/
+      fprintf_filtered(stream, "SYNMODE ");
+      if(!TYPE_NAME(SYMBOL_TYPE(new)) ||
+        !STREQ (TYPE_NAME(SYMBOL_TYPE(new)), SYMBOL_NAME(new)))
+       fprintf_filtered(stream, "%s = ", SYMBOL_SOURCE_NAME(new));
+      else
+        fprintf_filtered(stream, "<builtin> = ");
+      type_print(type,"",stream,0);
+      break;
 #endif
    default:
       error("Language not supported.");
@@ -132,7 +139,7 @@ c_print_type (type, varstring, stream, show, level)
   /* For demangled function names, we have the arglist as part of the name,
      so don't print an additional pair of ()'s */
 
-  demangled_args = varstring[strlen(varstring) - 1] == ')';
+  demangled_args = strchr(varstring, '(') != NULL;
   c_type_print_varspec_suffix (type, stream, show, 0, demangled_args);
 
 }
@@ -307,6 +314,7 @@ c_type_print_varspec_prefix (type, stream, show, passed_a_ptr)
     case TYPE_CODE_RANGE:
     case TYPE_CODE_STRING:
     case TYPE_CODE_BITSTRING:
+    case TYPE_CODE_COMPLEX:
       /* These types need no prefix.  They are listed here so that
         gcc -Wall will reveal any types that haven't been handled.  */
       break;
@@ -378,7 +386,8 @@ c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
        fprintf_filtered (stream, ")");
       
       fprintf_filtered (stream, "[");
-      if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
+      if (TYPE_LENGTH (type) >= 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
+         && TYPE_ARRAY_UPPER_BOUND_TYPE(type) != BOUND_CANNOT_BE_DETERMINED)
        fprintf_filtered (stream, "%d",
                          (TYPE_LENGTH (type)
                           / TYPE_LENGTH (TYPE_TARGET_TYPE (type))));
@@ -412,7 +421,19 @@ c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
       if (passed_a_ptr)
        fprintf_filtered (stream, ")");
       if (!demangled_args)
-       fprintf_filtered (stream, "()");
+       { int i, len = TYPE_NFIELDS (type);
+         fprintf_filtered (stream, "(");
+         for (i = 0; i < len; i++)
+           {
+             if (i > 0)
+               {
+                 fputs_filtered (", ", stream);
+                 wrap_here ("    ");
+               }
+             c_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0);
+           }
+         fprintf_filtered (stream, ")");
+       }
       c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
                                   passed_a_ptr, 0);
       break;
@@ -431,6 +452,7 @@ c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
     case TYPE_CODE_RANGE:
     case TYPE_CODE_STRING:
     case TYPE_CODE_BITSTRING:
+    case TYPE_CODE_COMPLEX:
       /* These types do not need a suffix.  They are listed so that
         gcc -Wall will report types that may not have been considered.  */
       break;
@@ -443,12 +465,12 @@ c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
 
    SHOW positive means print details about the type (e.g. enum values),
    and print structure elements passing SHOW - 1 for show.
-   SHOW zero means just print the type name or struct tag if there is one.
+   SHOW negative means just print the type name or struct tag if there is one.
    If there is no name, print something sensible but concise like
    "struct {...}".
-   SHOW negative means the same things as SHOW zero.  The difference is that
-   zero is used for printing structure elements and -1 is used for the
-   "whatis" command.  But I don't see any need to distinguish.
+   SHOW zero means just print the type name or struct tag if there is one.
+   If there is no name, print something sensible but not as concise like
+   "struct {int x; int y;}".
 
    LEVEL is the number of spaces to indent by.
    We increase it for some recursive calls.  */
@@ -523,13 +545,13 @@ c_type_print_base (type, stream, show, level)
            fputs_filtered (" ", stream);
        }
       wrap_here ("    ");
-      if (show <= 0)
+      if (show < 0)
        {
          /* If we just printed a tag name, no need to print anything else.  */
          if (TYPE_TAG_NAME (type) == NULL)
            fprintf_filtered (stream, "{...}");
        }
-      else if (show > 0)
+      else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
        {
          cp_type_print_derivation_info (stream, type);
          
@@ -630,6 +652,14 @@ c_type_print_base (type, stream, show, level)
              int is_constructor = name && STREQ(method_name, name);
              for (j = 0; j < len2; j++)
                {
+                 char *physname = TYPE_FN_FIELD_PHYSNAME (f, j);
+                 int is_full_physname_constructor = 
+                   ((physname[0]=='_' && physname[1]=='_' && 
+                     (isdigit(physname[2])
+                      || physname[2]=='Q'
+                      || physname[2]=='t'))
+                    || (strncmp(physname, "__ct__", 6) == 0));
+
                  QUIT;
                  if (TYPE_FN_FIELD_PROTECTED (f, j))
                    {
@@ -669,10 +699,10 @@ c_type_print_base (type, stream, show, level)
                               TYPE_FN_FIELD_PHYSNAME (f, j));
                      break;
                    }
-                 else if (!is_constructor)
+                 else if (!is_constructor && !is_full_physname_constructor)
                    {
                      type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)),
-                                 "", stream, 0);
+                                 "", stream, -1);
                      fputs_filtered (" ", stream);
                    }
                  if (TYPE_FN_FIELD_STUB (f, j))
@@ -730,13 +760,13 @@ c_type_print_base (type, stream, show, level)
        }
 
       wrap_here ("    ");
-      if (show <= 0)
+      if (show < 0)
        {
          /* If we just printed a tag name, no need to print anything else.  */
          if (TYPE_TAG_NAME (type) == NULL)
            fprintf_filtered (stream, "{...}");
        }
-      else if (show > 0)
+      else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
        {
          fprintf_filtered (stream, "{");
          len = TYPE_NFIELDS (type);
This page took 0.028621 seconds and 4 git commands to generate.