* ax-gdb.c (gen_var_ref): Use SYMBOL_LINKAGE_NAME.
[deliverable/binutils-gdb.git] / gdb / c-valprint.c
index 2ec90585b85a853c1fec00cf5fc46807ceb71eba..30a1be74076e8f6c003f26de325e43a1184c301f 100644 (file)
@@ -1,14 +1,14 @@
 /* Support for printing C values for GDB, the GNU debugger.
 
    Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
-   1998, 1999, 2000, 2001, 2003, 2005, 2006, 2007
+   1998, 1999, 2000, 2001, 2003, 2005, 2006, 2007, 2008
    Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -17,9 +17,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., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "gdb_string.h"
@@ -49,13 +47,59 @@ print_function_pointer_address (CORE_ADDR address, struct ui_file *stream)
   if (addressprint && func_addr != address)
     {
       fputs_filtered ("@", stream);
-      deprecated_print_address_numeric (address, 1, stream);
+      fputs_filtered (paddress (address), stream);
       fputs_filtered (": ", stream);
     }
   print_address_demangle (func_addr, stream, demangle);
 }
 
 
+/* Apply a heuristic to decide whether an array of TYPE or a pointer
+   to TYPE should be printed as a textual string.  Return non-zero if
+   it should, or zero if it should be treated as an array of integers
+   or pointer to integers.  FORMAT is the current format letter,
+   or 0 if none.
+
+   We guess that "char" is a character.  Explicitly signed and
+   unsigned character types are also characters.  Integer data from
+   vector types is not.  The user can override this by using the /s
+   format letter.  */
+
+static int
+textual_element_type (struct type *type, char format)
+{
+  struct type *true_type = check_typedef (type);
+
+  if (format != 0 && format != 's')
+    return 0;
+
+  /* TYPE_CODE_CHAR is always textual.  */
+  if (TYPE_CODE (true_type) == TYPE_CODE_CHAR)
+    return 1;
+
+  if (format == 's')
+    {
+      /* Print this as a string if we can manage it.  For now, no
+        wide character support.  */
+      if (TYPE_CODE (true_type) == TYPE_CODE_INT
+         && TYPE_LENGTH (true_type) == 1)
+       return 1;
+    }
+  else
+    {
+      /* If a one-byte TYPE_CODE_INT is missing the not-a-character
+        flag, then we treat it as text; otherwise, we assume it's
+        being used as data.  */
+      if (TYPE_CODE (true_type) == TYPE_CODE_INT
+         && TYPE_LENGTH (true_type) == 1
+         && !TYPE_NOTTEXT (true_type))
+       return 1;
+    }
+
+  return 0;
+}
+
+
 /* Print data of type TYPE located at VALADDR (within GDB), which came from
    the inferior at address ADDRESS, onto stdio stream STREAM according to
    FORMAT (a letter or 0 for natural format).  The data at VALADDR is in
@@ -94,12 +138,9 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
            {
              print_spaces_filtered (2 + 2 * recurse, stream);
            }
-         /* For an array of chars, print with string syntax.  */
-         if (eltlen == 1 &&
-             ((TYPE_CODE (elttype) == TYPE_CODE_INT && TYPE_NOSIGN (elttype))
-              || ((current_language->la_language == language_m2)
-                  && (TYPE_CODE (elttype) == TYPE_CODE_CHAR)))
-             && (format == 0 || format == 's'))
+
+         /* Print arrays of textual chars with a string syntax.  */
+          if (textual_element_type (elttype, format))
            {
              /* If requested, look for the first null char and only print
                 elements up to it.  */
@@ -186,19 +227,14 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
              return (0);
            }
 
-         if (addressprint && format != 's')
-           {
-             deprecated_print_address_numeric (addr, 1, stream);
-           }
+         if (addressprint)
+           fputs_filtered (paddress (addr), stream);
 
-         /* For a pointer to char or unsigned char, also print the string
+         /* For a pointer to a textual type, also print the string
             pointed to, unless pointer is null.  */
          /* FIXME: need to handle wchar_t here... */
 
-         if (TYPE_LENGTH (elttype) == 1
-             && TYPE_CODE (elttype) == TYPE_CODE_INT
-             && (format == 0 || format == 's')
-             && addr != 0)
+         if (textual_element_type (elttype, format) && addr != 0)
            {
              i = val_print_string (addr, -1, TYPE_LENGTH (elttype), stream);
            }
@@ -225,8 +261,8 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
                  int is_this_fld;
 
                  if (msymbol != NULL)
-                   wsym = lookup_symbol (DEPRECATED_SYMBOL_NAME (msymbol), block,
-                                         VAR_DOMAIN, &is_this_fld, NULL);
+                   wsym = lookup_symbol (SYMBOL_LINKAGE_NAME (msymbol), block,
+                                         VAR_DOMAIN, &is_this_fld);
 
                  if (wsym)
                    {
@@ -238,7 +274,8 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
                    }
                  vt_val = value_at (wtype, vt_address);
                  common_val_print (vt_val, stream, format,
-                                   deref_ref, recurse + 1, pretty);
+                                   deref_ref, recurse + 1, pretty,
+                                   current_language);
                  if (pretty)
                    {
                      fprintf_filtered (stream, "\n");
@@ -261,7 +298,7 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
          CORE_ADDR addr
            = extract_typed_address (valaddr + embedded_offset, type);
          fprintf_filtered (stream, "@");
-         deprecated_print_address_numeric (addr, 1, stream);
+         fputs_filtered (paddress (addr), stream);
          if (deref_ref)
            fputs_filtered (": ", stream);
        }
@@ -276,7 +313,7 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
               unpack_pointer (lookup_pointer_type (builtin_type_void),
                               valaddr + embedded_offset));
              common_val_print (deref_val, stream, format, deref_ref,
-                               recurse, pretty);
+                               recurse, pretty, current_language);
            }
          else
            fputs_filtered ("???", stream);
@@ -397,8 +434,8 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
          /* C and C++ has no single byte int type, char is used instead.
             Since we don't know whether the value is really intended to
             be used as an integer or a character, print the character
-            equivalent as well. */
-         if (TYPE_LENGTH (type) == 1)
+            equivalent as well.  */
+         if (textual_element_type (type, format))
            {
              fputs_filtered (" ", stream);
              LA_PRINT_CHAR ((unsigned char) unpack_long (type, valaddr + embedded_offset),
@@ -436,6 +473,13 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
        }
       break;
 
+    case TYPE_CODE_DECFLOAT:
+      if (format)
+       print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
+      else
+       print_decimal_floating (valaddr + embedded_offset, type, stream);
+      break;
+
     case TYPE_CODE_VOID:
       fprintf_filtered (stream, "void");
       break;
@@ -500,7 +544,9 @@ c_value_print (struct value *val, struct ui_file *stream, int format,
       || TYPE_CODE (type) == TYPE_CODE_REF)
     {
       /* Hack:  remove (char *) for char strings.  Their
-         type is indicated by the quoted string anyway. */
+         type is indicated by the quoted string anyway.
+         (Don't use textual_element_type here; quoted strings
+         are always exactly (char *).  */
       if (TYPE_CODE (type) == TYPE_CODE_PTR
          && TYPE_NAME (type) == NULL
          && TYPE_NAME (TYPE_TARGET_TYPE (type)) != NULL
@@ -556,6 +602,9 @@ c_value_print (struct value *val, struct ui_file *stream, int format,
        }
     }
 
+  if (!value_initialized (val))
+    fprintf_filtered (stream, " [uninitialized] ");
+
   if (objectprint && (TYPE_CODE (type) == TYPE_CODE_CLASS))
     {
       /* Attempt to determine real type of object */
@@ -570,7 +619,8 @@ c_value_print (struct value *val, struct ui_file *stream, int format,
          /* Print out object: enclosing type is same as real_type if full */
          return val_print (value_enclosing_type (val),
                            value_contents_all (val), 0,
-                           VALUE_ADDRESS (val), stream, format, 1, 0, pretty);
+                           VALUE_ADDRESS (val), stream, format, 1, 0,
+                           pretty, current_language);
           /* Note: When we look up RTTI entries, we don't get any information on
              const or volatile attributes */
        }
@@ -581,7 +631,8 @@ c_value_print (struct value *val, struct ui_file *stream, int format,
                            TYPE_NAME (value_enclosing_type (val)));
          return val_print (value_enclosing_type (val),
                            value_contents_all (val), 0,
-                           VALUE_ADDRESS (val), stream, format, 1, 0, pretty);
+                           VALUE_ADDRESS (val), stream, format, 1, 0,
+                           pretty, current_language);
        }
       /* Otherwise, we end up at the return outside this "if" */
     }
@@ -589,5 +640,5 @@ c_value_print (struct value *val, struct ui_file *stream, int format,
   return val_print (type, value_contents_all (val),
                    value_embedded_offset (val),
                    VALUE_ADDRESS (val) + value_offset (val),
-                   stream, format, 1, 0, pretty);
+                   stream, format, 1, 0, pretty, current_language);
 }
This page took 0.02762 seconds and 4 git commands to generate.