M68K Linux: Define regset structures.
[deliverable/binutils-gdb.git] / gdb / c-lang.c
index 9e571eace72c7e3ef8fbf9d347e1858f1a9ed801..185b38ed0c99fc71408084b9cba5bd3fa304a3e5 100644 (file)
@@ -1,7 +1,6 @@
 /* C language support routines for GDB, the GNU debugger.
 
-   Copyright (C) 1992-1996, 1998-2000, 2002-2005, 2007-2012 Free
-   Software Foundation, Inc.
+   Copyright (C) 1992-2014 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "expression.h"
 #include "parser-defs.h"
 #include "language.h"
+#include "varobj.h"
 #include "c-lang.h"
 #include "valprint.h"
 #include "macroscope.h"
-#include "gdb_assert.h"
 #include "charset.h"
-#include "gdb_string.h"
 #include "demangle.h"
 #include "cp-abi.h"
 #include "cp-support.h"
 #include "gdb_obstack.h"
 #include <ctype.h>
 #include "exceptions.h"
+#include "gdbcore.h"
 
 extern void _initialize_c_language (void);
 
@@ -197,18 +196,6 @@ c_printstr (struct ui_file *stream, struct type *type,
   const char *type_encoding;
   const char *encoding;
 
-  enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
-  unsigned int i;
-  unsigned int things_printed = 0;
-  int in_quotes = 0;
-  int need_comma = 0;
-  int width = TYPE_LENGTH (type);
-  struct obstack wchar_buf, output;
-  struct cleanup *cleanup;
-  struct wchar_iterator *iter;
-  int finished = 0;
-  int need_escape = 0;
-
   str_type = (classify_type (type, get_type_arch (type), &type_encoding)
              & ~C_CHAR);
   switch (str_type)
@@ -238,9 +225,13 @@ c_printstr (struct ui_file *stream, struct type *type,
    until a null character of the appropriate width is found, otherwise
    the string is read to the length of characters specified.  The size
    of a character is determined by the length of the target type of
-   the pointer or array.  If VALUE is an array with a known length,
-   the function will not read past the end of the array.  On
-   completion, *LENGTH will be set to the size of the string read in
+   the pointer or array.
+
+   If VALUE is an array with a known length, and *LENGTH is -1,
+   the function will not read past the end of the array.  However, any
+   declared size of the array is ignored if *LENGTH > 0.
+
+   On completion, *LENGTH will be set to the size of the string read in
    characters.  (If a length of -1 is specified, the length returned
    will not include the null character).  CHARSET is always set to the
    target charset.  */
@@ -257,7 +248,6 @@ c_get_string (struct value *value, gdb_byte **buffer,
   int req_length = *length;
   enum bfd_endian byte_order
     = gdbarch_byte_order (get_type_arch (type));
-  enum c_string_type kind;
 
   if (element_type == NULL)
     goto error;
@@ -286,9 +276,7 @@ c_get_string (struct value *value, gdb_byte **buffer,
 
   if (! c_textual_element_type (element_type, 0))
     goto error;
-  kind = classify_type (element_type,
-                       get_type_arch (element_type),
-                       charset);
+  classify_type (element_type, get_type_arch (element_type), charset);
   width = TYPE_LENGTH (element_type);
 
   /* If the string lives in GDB's memory instead of the inferior's,
@@ -323,17 +311,27 @@ c_get_string (struct value *value, gdb_byte **buffer,
     {
       CORE_ADDR addr = value_as_address (value);
 
+      /* Prior to the fix for PR 16196 read_string would ignore fetchlimit
+        if length > 0.  The old "broken" behaviour is the behaviour we want:
+        The caller may want to fetch 100 bytes from a variable length array
+        implemented using the common idiom of having an array of length 1 at
+        the end of a struct.  In this case we want to ignore the declared
+        size of the array.  However, it's counterintuitive to implement that
+        behaviour in read_string: what does fetchlimit otherwise mean if
+        length > 0.  Therefore we implement the behaviour we want here:
+        If *length > 0, don't specify a fetchlimit.  This preserves the
+        previous behaviour.  We could move this check above where we know
+        whether the array is declared with a fixed size, but we only want
+        to apply this behaviour when calling read_string.  PR 16286.  */
+      if (*length > 0)
+       fetchlimit = UINT_MAX;
+
       err = read_string (addr, *length, width, fetchlimit,
                         byte_order, buffer, length);
       if (err)
        {
          xfree (*buffer);
-         if (err == EIO)
-           throw_error (MEMORY_ERROR, "Address %s out of bounds",
-                        paddress (get_type_arch (type), addr));
-         else
-           error (_("Error reading string from inferior: %s"),
-                  safe_strerror (err));
+         memory_error (err, addr);
        }
     }
 
@@ -552,7 +550,7 @@ parse_one_string (struct obstack *output, char *data, int len,
       /* If we saw a run of characters, convert them all.  */
       if (p > data)
        convert_between_encodings (host_charset (), dest_charset,
-                                  data, p - data, 1,
+                                  (gdb_byte *) data, p - data, 1,
                                   output, translit_none);
       /* If we saw an escape, convert it.  */
       if (p < limit)
@@ -674,7 +672,7 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp,
            if (obstack_object_size (&output) != TYPE_LENGTH (type))
              error (_("Could not convert character "
                       "constant to target character set"));
-           value = unpack_long (type, obstack_base (&output));
+           value = unpack_long (type, (gdb_byte *) obstack_base (&output));
            result = value_from_longest (type, value);
          }
        else
@@ -748,6 +746,7 @@ const struct op_print c_op_print_tab[] =
   {"/", BINOP_DIV, PREC_MUL, 0},
   {"%", BINOP_REM, PREC_MUL, 0},
   {"@", BINOP_REPEAT, PREC_REPEAT, 0},
+  {"+", UNOP_PLUS, PREC_PREFIX, 0},
   {"-", UNOP_NEG, PREC_PREFIX, 0},
   {"!", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
   {"~", UNOP_COMPLEMENT, PREC_PREFIX, 0},
@@ -830,9 +829,9 @@ const struct exp_descriptor exp_descriptor_c =
 const struct language_defn c_language_defn =
 {
   "c",                         /* Language name */
+  "C",
   language_c,
   range_check_off,
-  type_check_off,
   case_sensitive_on,
   array_row_major,
   macro_expansion_c,
@@ -847,6 +846,7 @@ const struct language_defn c_language_defn =
   c_print_typedef,             /* Print a typedef using appropriate syntax */
   c_val_print,                 /* Print a value using appropriate syntax */
   c_value_print,               /* Print a top-level value */
+  default_read_var_value,      /* la_read_var_value */
   NULL,                                /* Language specific skip_trampoline */
   NULL,                                /* name_of_this */
   basic_lookup_symbol_nonlocal,        /* lookup_symbol_nonlocal */
@@ -863,8 +863,9 @@ const struct language_defn c_language_defn =
   default_print_array_index,
   default_pass_by_reference,
   c_get_string,
-  NULL,                                /* la_get_symbol_name_match_p */
+  NULL,                                /* la_get_symbol_name_cmp */
   iterate_over_symbols,
+  &c_varobj_ops,
   LANG_MAGIC
 };
 
@@ -953,9 +954,9 @@ cplus_language_arch_info (struct gdbarch *gdbarch,
 const struct language_defn cplus_language_defn =
 {
   "c++",                       /* Language name */
+  "C++",
   language_cplus,
   range_check_off,
-  type_check_off,
   case_sensitive_on,
   array_row_major,
   macro_expansion_c,
@@ -970,11 +971,12 @@ const struct language_defn cplus_language_defn =
   c_print_typedef,             /* Print a typedef using appropriate syntax */
   c_val_print,                 /* Print a value using appropriate syntax */
   c_value_print,               /* Print a top-level value */
+  default_read_var_value,      /* la_read_var_value */
   cplus_skip_trampoline,       /* Language specific skip_trampoline */
   "this",                       /* name_of_this */
   cp_lookup_symbol_nonlocal,   /* lookup_symbol_nonlocal */
   cp_lookup_transparent_type,   /* lookup_transparent_type */
-  cplus_demangle,              /* Language specific symbol demangler */
+  gdb_demangle,                        /* Language specific symbol demangler */
   cp_class_name_from_physname,  /* Language specific
                                   class_name_from_physname */
   c_op_print_tab,              /* expression operators for printing */
@@ -986,17 +988,18 @@ const struct language_defn cplus_language_defn =
   default_print_array_index,
   cp_pass_by_reference,
   c_get_string,
-  NULL,                                /* la_get_symbol_name_match_p */
+  NULL,                                /* la_get_symbol_name_cmp */
   iterate_over_symbols,
+  &cplus_varobj_ops,
   LANG_MAGIC
 };
 
 const struct language_defn asm_language_defn =
 {
   "asm",                       /* Language name */
+  "assembly",
   language_asm,
   range_check_off,
-  type_check_off,
   case_sensitive_on,
   array_row_major,
   macro_expansion_c,
@@ -1011,6 +1014,7 @@ const struct language_defn asm_language_defn =
   c_print_typedef,             /* Print a typedef using appropriate syntax */
   c_val_print,                 /* Print a value using appropriate syntax */
   c_value_print,               /* Print a top-level value */
+  default_read_var_value,      /* la_read_var_value */
   NULL,                                /* Language specific skip_trampoline */
   NULL,                                /* name_of_this */
   basic_lookup_symbol_nonlocal,        /* lookup_symbol_nonlocal */
@@ -1027,8 +1031,9 @@ const struct language_defn asm_language_defn =
   default_print_array_index,
   default_pass_by_reference,
   c_get_string,
-  NULL,                                /* la_get_symbol_name_match_p */
+  NULL,                                /* la_get_symbol_name_cmp */
   iterate_over_symbols,
+  &default_varobj_ops,
   LANG_MAGIC
 };
 
@@ -1040,9 +1045,9 @@ const struct language_defn asm_language_defn =
 const struct language_defn minimal_language_defn =
 {
   "minimal",                   /* Language name */
+  "Minimal",
   language_minimal,
   range_check_off,
-  type_check_off,
   case_sensitive_on,
   array_row_major,
   macro_expansion_c,
@@ -1057,6 +1062,7 @@ const struct language_defn minimal_language_defn =
   c_print_typedef,             /* Print a typedef using appropriate syntax */
   c_val_print,                 /* Print a value using appropriate syntax */
   c_value_print,               /* Print a top-level value */
+  default_read_var_value,      /* la_read_var_value */
   NULL,                                /* Language specific skip_trampoline */
   NULL,                                /* name_of_this */
   basic_lookup_symbol_nonlocal,        /* lookup_symbol_nonlocal */
@@ -1073,8 +1079,9 @@ const struct language_defn minimal_language_defn =
   default_print_array_index,
   default_pass_by_reference,
   c_get_string,
-  NULL,                                /* la_get_symbol_name_match_p */
+  NULL,                                /* la_get_symbol_name_cmp */
   iterate_over_symbols,
+  &default_varobj_ops,
   LANG_MAGIC
 };
 
This page took 0.043437 seconds and 4 git commands to generate.