[spu] Don't call set_gdbarch_cannot_step_breakpoint in spu_gdbarch_init
[deliverable/binutils-gdb.git] / gdb / eval.c
index 14bf6f7bae020f023f9c899b1052e25e6baeea1f..9804a977f7bc0c48818bd662510d1361f2d8c750 100644 (file)
@@ -1,6 +1,6 @@
 /* Evaluate expressions for GDB.
 
-   Copyright (C) 1986-2014 Free Software Foundation, Inc.
+   Copyright (C) 1986-2015 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
-#include <string.h>
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "value.h"
 #include "expression.h"
 #include "target.h"
 #include "frame.h"
+#include "gdbthread.h"
 #include "language.h"          /* For CAST_IS_CONVERSION.  */
 #include "f-lang.h"            /* For array bound stuff.  */
 #include "cp-abi.h"
 #include "parser-defs.h"
 #include "cp-support.h"
 #include "ui-out.h"
-#include "exceptions.h"
 #include "regcache.h"
 #include "user-regs.h"
 #include "valprint.h"
 #include "gdb_obstack.h"
 #include "objfiles.h"
-
-#include "gdb_assert.h"
-
 #include <ctype.h>
 
 /* This is defined in valops.c */
@@ -68,8 +64,29 @@ struct value *
 evaluate_subexp (struct type *expect_type, struct expression *exp,
                 int *pos, enum noside noside)
 {
-  return (*exp->language_defn->la_exp_desc->evaluate_exp) 
+  struct cleanup *cleanups;
+  struct value *retval;
+  int cleanup_temps = 0;
+
+  if (*pos == 0 && target_has_execution
+      && exp->language_defn->la_language == language_cplus
+      && !thread_stack_temporaries_enabled_p (inferior_ptid))
+    {
+      cleanups = enable_thread_stack_temporaries (inferior_ptid);
+      cleanup_temps = 1;
+    }
+
+  retval = (*exp->language_defn->la_exp_desc->evaluate_exp)
     (expect_type, exp, pos, noside);
+
+  if (cleanup_temps)
+    {
+      if (value_in_thread_stack_temporaries (retval, inferior_ptid))
+       retval = value_non_lval (retval);
+      do_cleanups (cleanups);
+    }
+
+  return retval;
 }
 \f
 /* Parse the string EXP as a C expression, evaluate it,
@@ -195,7 +212,6 @@ fetch_subexp_value (struct expression *exp, int *pc, struct value **valp,
                    int preserve_errors)
 {
   struct value *mark, *new_mark, *result;
-  volatile struct gdb_exception ex;
 
   *valp = NULL;
   if (resultp)
@@ -207,11 +223,11 @@ fetch_subexp_value (struct expression *exp, int *pc, struct value **valp,
   mark = value_mark ();
   result = NULL;
 
-  TRY_CATCH (ex, RETURN_MASK_ALL)
+  TRY
     {
       result = evaluate_subexp (NULL_TYPE, exp, pc, EVAL_NORMAL);
     }
-  if (ex.reason < 0)
+  CATCH (ex, RETURN_MASK_ALL)
     {
       /* Ignore memory errors if we want watchpoints pointing at
         inaccessible memory to still be created; otherwise, throw the
@@ -226,6 +242,7 @@ fetch_subexp_value (struct expression *exp, int *pc, struct value **valp,
          break;
        }
     }
+  END_CATCH
 
   new_mark = value_mark ();
   if (mark == new_mark)
@@ -241,13 +258,16 @@ fetch_subexp_value (struct expression *exp, int *pc, struct value **valp,
        *valp = result;
       else
        {
-         volatile struct gdb_exception except;
 
-         TRY_CATCH (except, RETURN_MASK_ERROR)
+         TRY
            {
              value_fetch_lazy (result);
              *valp = result;
            }
+         CATCH (except, RETURN_MASK_ERROR)
+           {
+           }
+         END_CATCH
        }
     }
 
@@ -346,12 +366,11 @@ evaluate_struct_tuple (struct value *struct_val,
   return struct_val;
 }
 
-/* Recursive helper function for setting elements of array tuples for
-   (the deleted) Chill.  The target is ARRAY (which has bounds
-   LOW_BOUND to HIGH_BOUND); the element value is ELEMENT; EXP, POS
-   and NOSIDE are as usual.  Evaluates index expresions and sets the
-   specified element(s) of ARRAY to ELEMENT.  Returns last index
-   value.  */
+/* Recursive helper function for setting elements of array tuples.
+   The target is ARRAY (which has bounds LOW_BOUND to HIGH_BOUND); the
+   element value is ELEMENT; EXP, POS and NOSIDE are as usual.
+   Evaluates index expresions and sets the specified element(s) of
+   ARRAY to ELEMENT.  Returns last index value.  */
 
 static LONGEST
 init_array_element (struct value *array, struct value *element,
@@ -369,22 +388,6 @@ init_array_element (struct value *array, struct value *element,
       return init_array_element (array, element,
                                 exp, pos, noside, low_bound, high_bound);
     }
-  else if (exp->elts[*pos].opcode == BINOP_RANGE)
-    {
-      LONGEST low, high;
-
-      (*pos)++;
-      low = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
-      high = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
-      if (low < low_bound || high > high_bound)
-       error (_("tuple range index out of range"));
-      for (index = low; index <= high; index++)
-       {
-         memcpy (value_contents_raw (array)
-                 + (index - low_bound) * element_size,
-                 value_contents (element), element_size);
-       }
-    }
   else
     {
       index = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
@@ -664,7 +667,6 @@ make_params (int num_types, struct type **param_types)
   TYPE_MAIN_TYPE (type) = XCNEW (struct main_type);
   TYPE_LENGTH (type) = 1;
   TYPE_CODE (type) = TYPE_CODE_METHOD;
-  TYPE_VPTR_FIELDNO (type) = -1;
   TYPE_CHAIN (type) = type;
   if (num_types > 0)
     {
@@ -763,16 +765,15 @@ evaluate_subexp_standard (struct type *expect_type,
         or reference to a base class and print object is on.  */
 
       {
-       volatile struct gdb_exception except;
        struct value *ret = NULL;
 
-       TRY_CATCH (except, RETURN_MASK_ERROR)
+       TRY
          {
            ret = value_of_variable (exp->elts[pc + 2].symbol,
                                     exp->elts[pc + 1].block);
          }
 
-       if (except.reason < 0)
+       CATCH (except, RETURN_MASK_ERROR)
          {
            if (noside == EVAL_AVOID_SIDE_EFFECTS)
              ret = value_zero (SYMBOL_TYPE (exp->elts[pc + 2].symbol),
@@ -780,6 +781,7 @@ evaluate_subexp_standard (struct type *expect_type,
            else
              throw_exception (except);
          }
+       END_CATCH
 
        return ret;
       }
@@ -903,11 +905,6 @@ evaluate_subexp_standard (struct type *expect_type,
              struct value *element;
              int index_pc = 0;
 
-             if (exp->elts[*pos].opcode == BINOP_RANGE)
-               {
-                 index_pc = ++(*pos);
-                 evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP);
-               }
              element = evaluate_subexp (element_type, exp, pos, noside);
              if (value_type (element) != element_type)
                element = value_cast (element_type, element);
@@ -958,22 +955,10 @@ evaluate_subexp_standard (struct type *expect_type,
              struct type *range_low_type, *range_high_type;
              struct value *elem_val;
 
-             if (exp->elts[*pos].opcode == BINOP_RANGE)
-               {
-                 (*pos)++;
-                 elem_val = evaluate_subexp (element_type, exp, pos, noside);
-                 range_low_type = value_type (elem_val);
-                 range_low = value_as_long (elem_val);
-                 elem_val = evaluate_subexp (element_type, exp, pos, noside);
-                 range_high_type = value_type (elem_val);
-                 range_high = value_as_long (elem_val);
-               }
-             else
-               {
-                 elem_val = evaluate_subexp (element_type, exp, pos, noside);
-                 range_low_type = range_high_type = value_type (elem_val);
-                 range_low = range_high = value_as_long (elem_val);
-               }
+             elem_val = evaluate_subexp (element_type, exp, pos, noside);
+             range_low_type = range_high_type = value_type (elem_val);
+             range_low = range_high = value_as_long (elem_val);
+
              /* Check types of elements to avoid mixture of elements from
                 different types. Also check if type of element is "compatible"
                 with element type of powerset.  */
@@ -1371,9 +1356,6 @@ evaluate_subexp_standard (struct type *expect_type,
          /* First, evaluate the structure into arg2.  */
          pc2 = (*pos)++;
 
-         if (noside == EVAL_SKIP)
-           goto nosideret;
-
          if (op == STRUCTOP_MEMBER)
            {
              arg2 = evaluate_subexp_for_address (exp, pos, noside);
@@ -1392,7 +1374,10 @@ evaluate_subexp_standard (struct type *expect_type,
          arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
 
          type = check_typedef (value_type (arg1));
-         if (TYPE_CODE (type) == TYPE_CODE_METHODPTR)
+         if (noside == EVAL_SKIP)
+           tem = 1;  /* Set it to the right arg index so that all arguments
+                        can also be skipped.  */
+         else if (TYPE_CODE (type) == TYPE_CODE_METHODPTR)
            {
              if (noside == EVAL_AVOID_SIDE_EFFECTS)
                arg1 = value_zero (TYPE_TARGET_TYPE (type), not_lval);
@@ -1407,7 +1392,7 @@ evaluate_subexp_standard (struct type *expect_type,
          else if (TYPE_CODE (type) == TYPE_CODE_MEMBERPTR)
            {
              struct type *type_ptr
-               = lookup_pointer_type (TYPE_DOMAIN_TYPE (type));
+               = lookup_pointer_type (TYPE_SELF_TYPE (type));
              struct type *target_type_ptr
                = lookup_pointer_type (TYPE_TARGET_TYPE (type));
 
@@ -1435,8 +1420,6 @@ evaluate_subexp_standard (struct type *expect_type,
          pc2 = (*pos)++;
          tem2 = longest_to_int (exp->elts[pc2 + 1].longconst);
          *pos += 3 + BYTES_TO_EXP_ELEM (tem2 + 1);
-         if (noside == EVAL_SKIP)
-           goto nosideret;
 
          if (op == STRUCTOP_STRUCT)
            {
@@ -1466,20 +1449,21 @@ evaluate_subexp_standard (struct type *expect_type,
                 operator and continue evaluation.  */
              while (unop_user_defined_p (op, arg2))
                {
-                 volatile struct gdb_exception except;
                  struct value *value = NULL;
-                 TRY_CATCH (except, RETURN_MASK_ERROR)
+                 TRY
                    {
                      value = value_x_unop (arg2, op, noside);
                    }
 
-                 if (except.reason < 0)
+                 CATCH (except, RETURN_MASK_ERROR)
                    {
                      if (except.error == NOT_FOUND_ERROR)
                        break;
                      else
                        throw_exception (except);
                    }
+                 END_CATCH
+
                  arg2 = value;
                }
            }
@@ -1585,6 +1569,9 @@ evaluate_subexp_standard (struct type *expect_type,
       /* Signal end of arglist.  */
       argvec[tem] = 0;
 
+      if (noside == EVAL_SKIP)
+       goto nosideret;
+
       if (op == OP_ADL_FUNC)
         {
           struct symbol *symp;
@@ -1601,7 +1588,7 @@ evaluate_subexp_standard (struct type *expect_type,
                                NON_METHOD, /* not method */
                                NULL, NULL, /* pass NULL symbol since
                                              symbol is unknown */
-                               NULL, &symp, NULL, 0);
+                               NULL, &symp, NULL, 0, noside);
 
           /* Now fix the expression being evaluated.  */
           exp->elts[save_pos1 + 2].symbol = symp;
@@ -1637,7 +1624,7 @@ evaluate_subexp_standard (struct type *expect_type,
                                          METHOD, /* method */
                                          &arg2,  /* the object */
                                          NULL, &valp, NULL,
-                                         &static_memfuncp, 0);
+                                         &static_memfuncp, 0, noside);
 
              if (op == OP_SCOPE && !static_memfuncp)
                {
@@ -1708,7 +1695,7 @@ evaluate_subexp_standard (struct type *expect_type,
                                          NULL,        /* no need for name */
                                          NON_METHOD,  /* not method */
                                          NULL, function, /* the function */
-                                         NULL, &symp, NULL, no_adl);
+                                         NULL, &symp, NULL, no_adl, noside);
 
              if (op == OP_VAR_VALUE)
                {
@@ -1734,8 +1721,6 @@ evaluate_subexp_standard (struct type *expect_type,
 
     do_call_it:
 
-      if (noside == EVAL_SKIP)
-       goto nosideret;
       if (argvec[0] == NULL)
        error (_("Cannot evaluate function -- may be inlined"));
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
@@ -1765,11 +1750,16 @@ evaluate_subexp_standard (struct type *expect_type,
            error (_("Expression of type other than "
                     "\"Function returning ...\" used as function"));
        }
-      if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_INTERNAL_FUNCTION)
-       return call_internal_function (exp->gdbarch, exp->language_defn,
-                                      argvec[0], nargs, argvec + 1);
-
-      return call_function_by_hand (argvec[0], nargs, argvec + 1);
+      switch (TYPE_CODE (value_type (argvec[0])))
+       {
+       case TYPE_CODE_INTERNAL_FUNCTION:
+         return call_internal_function (exp->gdbarch, exp->language_defn,
+                                        argvec[0], nargs, argvec + 1);
+       case TYPE_CODE_XMETHOD:
+         return call_xmethod (argvec[0], nargs, argvec + 1);
+       default:
+         return call_function_by_hand (argvec[0], nargs, argvec + 1);
+       }
       /* pai: FIXME save value from call_function_by_hand, then adjust
         pc by adjust_fn_pc if +ve.  */
 
@@ -1837,6 +1827,8 @@ evaluate_subexp_standard (struct type *expect_type,
          for (; tem <= nargs; tem++)
            argvec[tem] = evaluate_subexp_with_coercion (exp, pos, noside);
          argvec[tem] = 0;      /* signal end of arglist */
+         if (noside == EVAL_SKIP)
+           goto nosideret;
          goto do_call_it;
 
        default:
@@ -1875,20 +1867,21 @@ evaluate_subexp_standard (struct type *expect_type,
          arg1 with the value returned by evaluating operator->().  */
       while (unop_user_defined_p (op, arg1))
        {
-         volatile struct gdb_exception except;
          struct value *value = NULL;
-         TRY_CATCH (except, RETURN_MASK_ERROR)
+         TRY
            {
              value = value_x_unop (arg1, op, noside);
            }
 
-         if (except.reason < 0)
+         CATCH (except, RETURN_MASK_ERROR)
            {
              if (except.error == NOT_FOUND_ERROR)
                break;
              else
                throw_exception (except);
            }
+         END_CATCH
+
          arg1 = value;
        }
 
@@ -1903,7 +1896,7 @@ evaluate_subexp_standard (struct type *expect_type,
 
        get_user_print_options (&opts);
         if (opts.objectprint && TYPE_TARGET_TYPE(type)
-            && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_CLASS))
+            && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRUCT))
           {
             real_type = value_rtti_indirect_type (arg1, &full, &top,
                                                  &using_enc);
@@ -1945,7 +1938,7 @@ evaluate_subexp_standard (struct type *expect_type,
 
        case TYPE_CODE_MEMBERPTR:
          /* Now, convert these values to an address.  */
-         arg1 = value_cast_pointers (lookup_pointer_type (TYPE_DOMAIN_TYPE (type)),
+         arg1 = value_cast_pointers (lookup_pointer_type (TYPE_SELF_TYPE (type)),
                                      arg1, 1);
 
          mem_offset = value_as_long (arg2);
@@ -2122,13 +2115,6 @@ evaluate_subexp_standard (struct type *expect_type,
            }
        }
 
-    case BINOP_RANGE:
-      evaluate_subexp (NULL_TYPE, exp, pos, noside);
-      evaluate_subexp (NULL_TYPE, exp, pos, noside);
-      if (noside == EVAL_SKIP)
-       goto nosideret;
-      error (_("':' operator used in invalid context"));
-
     case BINOP_SUBSCRIPT:
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
@@ -2159,15 +2145,6 @@ evaluate_subexp_standard (struct type *expect_type,
          else
            return value_subscript (arg1, value_as_long (arg2));
        }
-
-    case BINOP_IN:
-      arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
-      arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
-      if (noside == EVAL_SKIP)
-       goto nosideret;
-      type = language_bool_type (exp->language_defn, exp->gdbarch);
-      return value_from_longest (type, (LONGEST) value_in (arg1, arg2));
-
     case MULTI_SUBSCRIPT:
       (*pos) += 2;
       nargs = longest_to_int (exp->elts[pc + 1].longconst);
This page took 0.029766 seconds and 4 git commands to generate.