Stop assuming no-debug-info functions return int
[deliverable/binutils-gdb.git] / gdb / eval.c
index 7ccc8836aba10a5373071acaee74ba30e627e883..1ec67513af262d77383bc73bd9fe2c95c31b79d1 100644 (file)
@@ -1,6 +1,6 @@
 /* Evaluate expressions for GDB.
 
-   Copyright (C) 1986-2015 Free Software Foundation, Inc.
+   Copyright (C) 1986-2017 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -95,14 +95,9 @@ evaluate_subexp (struct type *expect_type, struct expression *exp,
 CORE_ADDR
 parse_and_eval_address (const char *exp)
 {
-  struct expression *expr = parse_expression (exp);
-  CORE_ADDR addr;
-  struct cleanup *old_chain =
-    make_cleanup (free_current_contents, &expr);
-
-  addr = value_as_address (evaluate_expression (expr));
-  do_cleanups (old_chain);
-  return addr;
+  expression_up expr = parse_expression (exp);
+
+  return value_as_address (evaluate_expression (expr.get ()));
 }
 
 /* Like parse_and_eval_address, but treats the value of the expression
@@ -110,27 +105,17 @@ parse_and_eval_address (const char *exp)
 LONGEST
 parse_and_eval_long (const char *exp)
 {
-  struct expression *expr = parse_expression (exp);
-  LONGEST retval;
-  struct cleanup *old_chain =
-    make_cleanup (free_current_contents, &expr);
-
-  retval = value_as_long (evaluate_expression (expr));
-  do_cleanups (old_chain);
-  return (retval);
+  expression_up expr = parse_expression (exp);
+
+  return value_as_long (evaluate_expression (expr.get ()));
 }
 
 struct value *
 parse_and_eval (const char *exp)
 {
-  struct expression *expr = parse_expression (exp);
-  struct value *val;
-  struct cleanup *old_chain =
-    make_cleanup (free_current_contents, &expr);
+  expression_up expr = parse_expression (exp);
 
-  val = evaluate_expression (expr);
-  do_cleanups (old_chain);
-  return val;
+  return evaluate_expression (expr.get ());
 }
 
 /* Parse up to a comma (or to a closeparen)
@@ -140,14 +125,9 @@ parse_and_eval (const char *exp)
 struct value *
 parse_to_comma_and_eval (const char **expp)
 {
-  struct expression *expr = parse_exp_1 (expp, 0, (struct block *) 0, 1);
-  struct value *val;
-  struct cleanup *old_chain =
-    make_cleanup (free_current_contents, &expr);
+  expression_up expr = parse_exp_1 (expp, 0, (struct block *) 0, 1);
 
-  val = evaluate_expression (expr);
-  do_cleanups (old_chain);
-  return val;
+  return evaluate_expression (expr.get ());
 }
 \f
 /* Evaluate an expression in internal prefix form
@@ -406,7 +386,8 @@ value_f90_subarray (struct value *array,
   int pc = (*pos) + 1;
   LONGEST low_bound, high_bound;
   struct type *range = check_typedef (TYPE_INDEX_TYPE (value_type (array)));
-  enum f90_range_type range_type = longest_to_int (exp->elts[pc].longconst);
+  enum range_type range_type
+    = (enum range_type) longest_to_int (exp->elts[pc].longconst);
  
   *pos += 3;
 
@@ -639,7 +620,7 @@ static int
 ptrmath_type_p (const struct language_defn *lang, struct type *type)
 {
   type = check_typedef (type);
-  if (TYPE_CODE (type) == TYPE_CODE_REF)
+  if (TYPE_IS_REFERENCE (type))
     type = TYPE_TARGET_TYPE (type);
 
   switch (TYPE_CODE (type))
@@ -997,7 +978,7 @@ evaluate_subexp_standard (struct type *expect_type,
          return set;
        }
 
-      argvec = (struct value **) alloca (sizeof (struct value *) * nargs);
+      argvec = XALLOCAVEC (struct value *, nargs);
       for (tem = 0; tem < nargs; tem++)
        {
          /* Ensure that array expressions are coerced into pointer
@@ -1081,8 +1062,7 @@ evaluate_subexp_standard (struct type *expect_type,
 
        selector = exp->elts[pc + 1].longconst;
        nargs = exp->elts[pc + 2].longconst;
-       argvec = (struct value **) alloca (sizeof (struct value *) 
-                                          * (nargs + 5));
+       argvec = XALLOCAVEC (struct value *, nargs + 5);
 
        (*pos) += 3;
 
@@ -1167,12 +1147,12 @@ evaluate_subexp_standard (struct type *expect_type,
        argvec[3] = value_from_longest (long_type, selector);
        argvec[4] = 0;
 
-       ret = call_function_by_hand (argvec[0], 3, argvec + 1);
+       ret = call_function_by_hand (argvec[0], NULL, 3, argvec + 1);
        if (gnu_runtime)
          {
            /* Function objc_msg_lookup returns a pointer.  */
            argvec[0] = ret;
-           ret = call_function_by_hand (argvec[0], 3, argvec + 1);
+           ret = call_function_by_hand (argvec[0], NULL, 3, argvec + 1);
          }
        if (value_as_long (ret) == 0)
          error (_("Target does not respond to this message selector."));
@@ -1189,11 +1169,11 @@ evaluate_subexp_standard (struct type *expect_type,
        argvec[3] = value_from_longest (long_type, selector);
        argvec[4] = 0;
 
-       ret = call_function_by_hand (argvec[0], 3, argvec + 1);
+       ret = call_function_by_hand (argvec[0], NULL, 3, argvec + 1);
        if (gnu_runtime)
          {
            argvec[0] = ret;
-           ret = call_function_by_hand (argvec[0], 3, argvec + 1);
+           ret = call_function_by_hand (argvec[0], NULL, 3, argvec + 1);
          }
 
        /* ret should now be the selector.  */
@@ -1335,10 +1315,10 @@ evaluate_subexp_standard (struct type *expect_type,
            deprecated_set_value_type (argvec[0],
                                       lookup_pointer_type (lookup_function_type (value_type (argvec[0]))));
            argvec[0]
-             = call_function_by_hand (argvec[0], nargs + 2, argvec + 1);
+             = call_function_by_hand (argvec[0], NULL, nargs + 2, argvec + 1);
          }
 
-       ret = call_function_by_hand (argvec[0], nargs + 2, argvec + 1);
+       ret = call_function_by_hand (argvec[0], NULL, nargs + 2, argvec + 1);
        return ret;
       }
       break;
@@ -1725,12 +1705,9 @@ evaluate_subexp_standard (struct type *expect_type,
        error (_("Cannot evaluate function -- may be inlined"));
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
        {
-         /* If the return type doesn't look like a function type, call an
-            error.  This can happen if somebody tries to turn a variable into
-            a function call.  This is here because people often want to
-            call, eg, strcmp, which gdb doesn't know is a function.  If
-            gdb isn't asked for it's opinion (ie. through "whatis"),
-            it won't offer it.  */
+         /* If the return type doesn't look like a function type,
+            call an error.  This can happen if somebody tries to turn
+            a variable into a function call.  */
 
          struct type *ftype = value_type (argvec[0]);
 
@@ -1751,10 +1728,19 @@ evaluate_subexp_standard (struct type *expect_type,
                error (_("Xmethod is missing return type."));
              return value_zero (return_type, not_lval);
            }
-         else if (TYPE_GNU_IFUNC (ftype))
-           return allocate_value (TYPE_TARGET_TYPE (TYPE_TARGET_TYPE (ftype)));
-         else if (TYPE_TARGET_TYPE (ftype))
-           return allocate_value (TYPE_TARGET_TYPE (ftype));
+         else if (TYPE_CODE (ftype) == TYPE_CODE_FUNC
+                  || TYPE_CODE (ftype) == TYPE_CODE_METHOD)
+           {
+             struct type *return_type = TYPE_TARGET_TYPE (ftype);
+
+             if (return_type == NULL)
+               return_type = expect_type;
+
+             if (return_type == NULL)
+               error_call_unknown_return_type (NULL);
+
+             return allocate_value (return_type);
+           }
          else
            error (_("Expression of type other than "
                     "\"Function returning ...\" used as function"));
@@ -1767,7 +1753,8 @@ evaluate_subexp_standard (struct type *expect_type,
        case TYPE_CODE_XMETHOD:
          return call_xmethod (argvec[0], nargs, argvec + 1);
        default:
-         return call_function_by_hand (argvec[0], nargs, argvec + 1);
+         return call_function_by_hand (argvec[0],
+                                       expect_type, nargs, argvec + 1);
        }
       /* pai: FIXME save value from call_function_by_hand, then adjust
         pc by adjust_fn_pc if +ve.  */
@@ -1810,13 +1797,13 @@ evaluate_subexp_standard (struct type *expect_type,
       switch (code)
        {
        case TYPE_CODE_ARRAY:
-         if (exp->elts[*pos].opcode == OP_F90_RANGE)
+         if (exp->elts[*pos].opcode == OP_RANGE)
            return value_f90_subarray (arg1, exp, pos, noside);
          else
            goto multi_f77_subscript;
 
        case TYPE_CODE_STRING:
-         if (exp->elts[*pos].opcode == OP_F90_RANGE)
+         if (exp->elts[*pos].opcode == OP_RANGE)
            return value_f90_subarray (arg1, exp, pos, noside);
          else
            {
@@ -1862,7 +1849,7 @@ evaluate_subexp_standard (struct type *expect_type,
       arg3 = value_struct_elt (&arg1, NULL, &exp->elts[pc + 2].string,
                               NULL, "structure");
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
-       arg3 = value_zero (value_type (arg3), not_lval);
+       arg3 = value_zero (value_type (arg3), VALUE_LVAL (arg3));
       return arg3;
 
     case STRUCTOP_PTR:
@@ -1900,7 +1887,8 @@ evaluate_subexp_standard (struct type *expect_type,
       {
         struct type *type = value_type (arg1);
         struct type *real_type;
-        int full, top, using_enc;
+        int full, using_enc;
+        LONGEST top;
        struct value_print_options opts;
 
        get_user_print_options (&opts);
@@ -1917,7 +1905,7 @@ evaluate_subexp_standard (struct type *expect_type,
       arg3 = value_struct_elt (&arg1, NULL, &exp->elts[pc + 2].string,
                               NULL, "structure pointer");
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
-       arg3 = value_zero (value_type (arg3), not_lval);
+       arg3 = value_zero (value_type (arg3), VALUE_LVAL (arg3));
       return arg3;
 
     case STRUCTOP_MEMBER:
@@ -2427,7 +2415,8 @@ evaluate_subexp_standard (struct type *expect_type,
       if (noside == EVAL_SKIP)
        goto nosideret;
       type = check_typedef (value_type (arg2));
-      if (TYPE_CODE (type) != TYPE_CODE_INT)
+      if (TYPE_CODE (type) != TYPE_CODE_INT
+          && TYPE_CODE (type) != TYPE_CODE_ENUM)
        error (_("Non-integral right operand for \"@\" operator."));
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
        {
@@ -2509,7 +2498,7 @@ evaluate_subexp_standard (struct type *expect_type,
        {
          type = check_typedef (value_type (arg1));
          if (TYPE_CODE (type) == TYPE_CODE_PTR
-             || TYPE_CODE (type) == TYPE_CODE_REF
+             || TYPE_IS_REFERENCE (type)
          /* In C you can dereference an array to get the 1st elt.  */
              || TYPE_CODE (type) == TYPE_CODE_ARRAY
            )
@@ -2745,18 +2734,7 @@ evaluate_subexp_standard (struct type *expect_type,
       if (noside == EVAL_SKIP)
         goto nosideret;
       else if (noside == EVAL_AVOID_SIDE_EFFECTS)
-       {
-         struct type *type = exp->elts[pc + 1].type;
-
-         /* If this is a typedef, then find its immediate target.  We
-            use check_typedef to resolve stubs, but we ignore its
-            result because we do not want to dig past all
-            typedefs.  */
-         check_typedef (type);
-         if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF)
-           type = TYPE_TARGET_TYPE (type);
-         return allocate_value (type);
-       }
+       return allocate_value (exp->elts[pc + 1].type);
       else
         error (_("Attempt to use a type name as an expression"));
 
@@ -2787,9 +2765,9 @@ evaluate_subexp_standard (struct type *expect_type,
            {
              struct type *type = value_type (result);
 
-             if (TYPE_CODE (check_typedef (type)) != TYPE_CODE_REF)
+             if (!TYPE_IS_REFERENCE (type))
                {
-                 type = lookup_reference_type (type);
+                 type = lookup_lvalue_reference_type (type);
                  result = allocate_value (type);
                }
            }
@@ -2890,7 +2868,7 @@ evaluate_subexp_for_address (struct expression *exp, int *pos,
 
       /* C++: The "address" of a reference should yield the address
        * of the object pointed to.  Let value_addr() deal with it.  */
-      if (TYPE_CODE (SYMBOL_TYPE (var)) == TYPE_CODE_REF)
+      if (TYPE_IS_REFERENCE (SYMBOL_TYPE (var)))
        goto default_case;
 
       (*pos) += 4;
@@ -2929,7 +2907,7 @@ evaluate_subexp_for_address (struct expression *exp, int *pos,
        {
          struct type *type = check_typedef (value_type (x));
 
-         if (TYPE_CODE (type) == TYPE_CODE_REF)
+         if (TYPE_IS_REFERENCE (type))
            return value_zero (lookup_pointer_type (TYPE_TARGET_TYPE (type)),
                               not_lval);
          else if (VALUE_LVAL (x) == lval_memory || value_must_coerce_to_target (x))
@@ -3019,7 +2997,7 @@ evaluate_subexp_for_sizeof (struct expression *exp, int *pos,
       val = evaluate_subexp (NULL_TYPE, exp, pos, EVAL_AVOID_SIDE_EFFECTS);
       type = check_typedef (value_type (val));
       if (TYPE_CODE (type) != TYPE_CODE_PTR
-         && TYPE_CODE (type) != TYPE_CODE_REF
+         && !TYPE_IS_REFERENCE (type)
          && TYPE_CODE (type) != TYPE_CODE_ARRAY)
        error (_("Attempt to take contents of a non-pointer value."));
       type = TYPE_TARGET_TYPE (type);
@@ -3091,7 +3069,7 @@ evaluate_subexp_for_sizeof (struct expression *exp, int *pos,
      the size of the referenced type."  */
   type = check_typedef (type);
   if (exp->language_defn->la_language == language_cplus
-      && TYPE_CODE (type) == TYPE_CODE_REF)
+      && (TYPE_IS_REFERENCE (type)))
     type = check_typedef (TYPE_TARGET_TYPE (type));
   return value_from_longest (size_type, (LONGEST) TYPE_LENGTH (type));
 }
@@ -3102,14 +3080,13 @@ struct type *
 parse_and_eval_type (char *p, int length)
 {
   char *tmp = (char *) alloca (length + 4);
-  struct expression *expr;
 
   tmp[0] = '(';
   memcpy (tmp + 1, p, length);
   tmp[length + 1] = ')';
   tmp[length + 2] = '0';
   tmp[length + 3] = '\0';
-  expr = parse_expression (tmp);
+  expression_up expr = parse_expression (tmp);
   if (expr->elts[0].opcode != UNOP_CAST)
     error (_("Internal error in eval_type."));
   return expr->elts[1].type;
This page took 0.03704 seconds and 4 git commands to generate.