Split vDSO range lookup to a gdbarch hook
[deliverable/binutils-gdb.git] / gdb / expprint.c
index c3f6697f62dae7890fd8c792d0c1ad68ccc69ed2..59fd4e32330f00c289f6a0ccf2222e1eba9892f7 100644 (file)
@@ -1,7 +1,6 @@
 /* Print in infix form a struct expression.
 
-   Copyright (C) 1986, 1988-1989, 1991-2000, 2003, 2007-2012 Free
-   Software Foundation, Inc.
+   Copyright (C) 1986-2014 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "parser-defs.h"
 #include "user-regs.h"         /* For user_reg_map_regnum_to_name.  */
 #include "target.h"
-#include "gdb_string.h"
 #include "block.h"
 #include "objfiles.h"
-#include "gdb_assert.h"
 #include "valprint.h"
 
-#ifdef HAVE_CTYPE_H
 #include <ctype.h>
-#endif
 
 void
 print_expression (struct expression *exp, struct ui_file *stream)
@@ -83,6 +78,11 @@ print_subexp_standard (struct expression *exp, int *pos,
     {
       /* Common ops */
 
+    case OP_TYPE:
+      (*pos) += 2;
+      type_print (exp->elts[pc + 1].type, "", stream, 0);
+      return;
+
     case OP_SCOPE:
       myprec = PREC_PREFIX;
       assoc = 0;
@@ -97,7 +97,7 @@ print_subexp_standard (struct expression *exp, int *pos,
       {
        struct value_print_options opts;
 
-       get_raw_print_options (&opts);
+       get_no_prettyformat_print_options (&opts);
        (*pos) += 3;
        value_print (value_from_longest (exp->elts[pc + 1].type,
                                         exp->elts[pc + 2].longconst),
@@ -109,7 +109,7 @@ print_subexp_standard (struct expression *exp, int *pos,
       {
        struct value_print_options opts;
 
-       get_raw_print_options (&opts);
+       get_no_prettyformat_print_options (&opts);
        (*pos) += 3;
        value_print (value_from_double (exp->elts[pc + 1].type,
                                        exp->elts[pc + 2].doubleconst),
@@ -119,7 +119,7 @@ print_subexp_standard (struct expression *exp, int *pos,
 
     case OP_VAR_VALUE:
       {
-       struct block *b;
+       const struct block *b;
 
        (*pos) += 3;
        b = exp->elts[pc + 1].block;
@@ -201,17 +201,11 @@ print_subexp_standard (struct expression *exp, int *pos,
           additional parameter to LA_PRINT_STRING.  -fnf */
        get_user_print_options (&opts);
        LA_PRINT_STRING (stream, builtin_type (exp->gdbarch)->builtin_char,
-                        &exp->elts[pc + 2].string, nargs, NULL, 0, &opts);
+                        (gdb_byte *) &exp->elts[pc + 2].string, nargs,
+                        NULL, 0, &opts);
       }
       return;
 
-    case OP_BITSTRING:
-      nargs = longest_to_int (exp->elts[pc + 1].longconst);
-      (*pos)
-       += 3 + BYTES_TO_EXP_ELEM ((nargs + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT);
-      fprintf_unfiltered (stream, "B'<unimplemented>'");
-      return;
-
     case OP_OBJC_NSSTRING:     /* Objective-C Foundation Class
                                   NSString constant.  */
       {
@@ -222,7 +216,8 @@ print_subexp_standard (struct expression *exp, int *pos,
        fputs_filtered ("@\"", stream);
        get_user_print_options (&opts);
        LA_PRINT_STRING (stream, builtin_type (exp->gdbarch)->builtin_char,
-                        &exp->elts[pc + 2].string, nargs, NULL, 0, &opts);
+                        (gdb_byte *) &exp->elts[pc + 2].string, nargs,
+                        NULL, 0, &opts);
        fputs_filtered ("\"", stream);
       }
       return;
@@ -312,7 +307,7 @@ print_subexp_standard (struct expression *exp, int *pos,
 
          get_user_print_options (&opts);
          LA_PRINT_STRING (stream, builtin_type (exp->gdbarch)->builtin_char,
-                          tempstr, nargs - 1, NULL, 0, &opts);
+                          (gdb_byte *) tempstr, nargs - 1, NULL, 0, &opts);
          (*pos) = pc;
        }
       else
@@ -330,21 +325,6 @@ print_subexp_standard (struct expression *exp, int *pos,
        }
       return;
 
-    case OP_LABELED:
-      tem = longest_to_int (exp->elts[pc + 1].longconst);
-      (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
-      /* Gcc support both these syntaxes.  Unsure which is preferred.  */
-#if 1
-      fputs_filtered (&exp->elts[pc + 2].string, stream);
-      fputs_filtered (": ", stream);
-#else
-      fputs_filtered (".", stream);
-      fputs_filtered (&exp->elts[pc + 2].string, stream);
-      fputs_filtered ("=", stream);
-#endif
-      print_subexp (exp, pos, stream, PREC_SUFFIX);
-      return;
-
     case TERNOP_COND:
       if ((int) prec > (int) PREC_COMMA)
        fputs_filtered ("(", stream);
@@ -362,7 +342,6 @@ print_subexp_standard (struct expression *exp, int *pos,
       return;
 
     case TERNOP_SLICE:
-    case TERNOP_SLICE_COUNT:
       print_subexp (exp, pos, stream, PREC_SUFFIX);
       fputs_filtered ("(", stream);
       print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
@@ -430,7 +409,6 @@ print_subexp_standard (struct expression *exp, int *pos,
       return;
 
     case UNOP_CAST_TYPE:
-      (*pos) += 1;
       if ((int) prec > (int) PREC_PREFIX)
        fputs_filtered ("(", stream);
       fputs_filtered ("(", stream);
@@ -446,7 +424,6 @@ print_subexp_standard (struct expression *exp, int *pos,
       fputs_filtered (opcode == UNOP_DYNAMIC_CAST ? "dynamic_cast"
                      : "reinterpret_cast", stream);
       fputs_filtered ("<", stream);
-      (*pos) += 1;
       print_subexp (exp, pos, stream, PREC_PREFIX);
       fputs_filtered ("> (", stream);
       print_subexp (exp, pos, stream, PREC_PREFIX);
@@ -469,7 +446,7 @@ print_subexp_standard (struct expression *exp, int *pos,
          (*pos) += 4;
          val = value_at_lazy (exp->elts[pc + 1].type,
                               (CORE_ADDR) exp->elts[pc + 5].longconst);
-         get_raw_print_options (&opts);
+         get_no_prettyformat_print_options (&opts);
          value_print (val, stream, &opts);
        }
       else
@@ -484,7 +461,6 @@ print_subexp_standard (struct expression *exp, int *pos,
       return;
 
     case UNOP_MEMVAL_TYPE:
-      (*pos) += 1;
       if ((int) prec > (int) PREC_PREFIX)
        fputs_filtered ("(", stream);
       fputs_filtered ("{", stream);
@@ -691,7 +667,7 @@ op_name_standard (enum exp_opcode opcode)
       {
        static char buf[30];
 
-       sprintf (buf, "<unknown %d>", opcode);
+       xsnprintf (buf, sizeof (buf), "<unknown %d>", opcode);
        return buf;
       }
 #define OP(name)       \
@@ -792,7 +768,6 @@ dump_subexp_body_standard (struct expression *exp,
     {
     case TERNOP_COND:
     case TERNOP_SLICE:
-    case TERNOP_SLICE_COUNT:
       elt = dump_subexp (exp, stream, elt);
       /* FALL THROUGH */
     case BINOP_ADD:
@@ -825,8 +800,6 @@ dump_subexp_body_standard (struct expression *exp,
     case BINOP_ASSIGN_MODIFY:
     case BINOP_VAL:
     case BINOP_CONCAT:
-    case BINOP_IN:
-    case BINOP_RANGE:
     case BINOP_END:
     case STRUCTOP_MEMBER:
     case STRUCTOP_MPTR:
@@ -938,7 +911,6 @@ dump_subexp_body_standard (struct expression *exp,
     case UNOP_REINTERPRET_CAST:
     case UNOP_CAST_TYPE:
     case UNOP_MEMVAL_TYPE:
-      ++elt;
       fprintf_filtered (stream, " (");
       elt = dump_subexp (exp, stream, elt);
       fprintf_filtered (stream, ")");
@@ -958,7 +930,7 @@ dump_subexp_body_standard (struct expression *exp,
       gdb_print_host_address (exp->elts[elt + 1].type, stream);
       fprintf_filtered (stream, " (__thread /* \"%s\" */ ",
                         (exp->elts[elt].objfile == NULL ? "(null)"
-                        : exp->elts[elt].objfile->name));
+                        : objfile_name (exp->elts[elt].objfile)));
       type_print (exp->elts[elt + 1].type, NULL, stream, 0);
       fprintf_filtered (stream, ")");
       elt = dump_subexp (exp, stream, elt + 3);
@@ -971,6 +943,17 @@ dump_subexp_body_standard (struct expression *exp,
       fprintf_filtered (stream, ")");
       elt += 2;
       break;
+    case OP_TYPEOF:
+    case OP_DECLTYPE:
+      fprintf_filtered (stream, "Typeof (");
+      elt = dump_subexp (exp, stream, elt);
+      fprintf_filtered (stream, ")");
+      break;
+    case OP_TYPEID:
+      fprintf_filtered (stream, "typeid (");
+      elt = dump_subexp (exp, stream, elt);
+      fprintf_filtered (stream, ")");
+      break;
     case STRUCTOP_STRUCT:
     case STRUCTOP_PTR:
       {
@@ -1024,17 +1007,32 @@ dump_subexp_body_standard (struct expression *exp,
        elt = dump_subexp (exp, stream, elt);
       }
       break;
+    case OP_STRING:
+      {
+       LONGEST len = exp->elts[elt].longconst;
+       LONGEST type = exp->elts[elt + 1].longconst;
+
+       fprintf_filtered (stream, "Language-specific string type: %s",
+                         plongest (type));
+
+       /* Skip length.  */
+       elt += 1;
+
+       /* Skip string content. */
+       elt += BYTES_TO_EXP_ELEM (len);
+
+       /* Skip length and ending OP_STRING. */
+       elt += 2;
+      }
+      break;
     default:
     case OP_NULL:
     case MULTI_SUBSCRIPT:
     case OP_F77_UNDETERMINED_ARGLIST:
     case OP_COMPLEX:
-    case OP_STRING:
-    case OP_BITSTRING:
     case OP_BOOL:
     case OP_M2_STRING:
     case OP_THIS:
-    case OP_LABELED:
     case OP_NAME:
       fprintf_filtered (stream, "Unknown format");
     }
@@ -1050,10 +1048,7 @@ dump_prefix_expression (struct expression *exp, struct ui_file *stream)
   fprintf_filtered (stream, "Dump of expression @ ");
   gdb_print_host_address (exp, stream);
   fputs_filtered (", after conversion to prefix form:\nExpression: `", stream);
-  if (exp->elts[0].opcode != OP_TYPE)
-    print_expression (exp, stream);
-  else
-    fputs_filtered ("Type printing not yet supported....", stream);
+  print_expression (exp, stream);
   fprintf_filtered (stream, "'\n\tLanguage %s, %d elements, %ld bytes each.\n",
                    exp->language_defn->la_name, exp->nelts,
                    (long) sizeof (union exp_element));
This page took 0.027009 seconds and 4 git commands to generate.