* configure: Regenerate to track ../common/common.m4 changes.
[deliverable/binutils-gdb.git] / gdb / eval.c
index c385539c1a78deedc70df3459f5966030d9b8343..bbd7539a9fbbe80970685135a798f6f28cb960c8 100644 (file)
@@ -1,14 +1,14 @@
 /* Evaluate expressions for GDB.
 
    Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007
+   1996, 1997, 1998, 1999, 2000, 2001, 2002, 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"
@@ -177,6 +175,36 @@ evaluate_type (struct expression *exp)
   return evaluate_subexp (NULL_TYPE, exp, &pc, EVAL_AVOID_SIDE_EFFECTS);
 }
 
+/* Evaluate a subexpression, avoiding all memory references and
+   getting a value whose type alone is correct.  */
+
+struct value *
+evaluate_subexpression_type (struct expression *exp, int subexp)
+{
+  return evaluate_subexp (NULL_TYPE, exp, &subexp, EVAL_AVOID_SIDE_EFFECTS);
+}
+
+/* Extract a field operation from an expression.  If the subexpression
+   of EXP starting at *SUBEXP is not a structure dereference
+   operation, return NULL.  Otherwise, return the name of the
+   dereferenced field, and advance *SUBEXP to point to the
+   subexpression of the left-hand-side of the dereference.  This is
+   used when completing field names.  */
+
+char *
+extract_field_op (struct expression *exp, int *subexp)
+{
+  int tem;
+  char *result;
+  if (exp->elts[*subexp].opcode != STRUCTOP_STRUCT
+      && exp->elts[*subexp].opcode != STRUCTOP_PTR)
+    return NULL;
+  tem = longest_to_int (exp->elts[*subexp + 1].longconst);
+  result = &exp->elts[*subexp + 2].string;
+  (*subexp) += 1 + 3 + BYTES_TO_EXP_ELEM (tem + 1);
+  return result;
+}
+
 /* If the next expression is an OP_LABELED, skips past it,
    returning the label.  Otherwise, does nothing and returns NULL. */
 
@@ -458,6 +486,11 @@ evaluate_subexp_standard (struct type *expect_type,
       return value_from_double (exp->elts[pc + 1].type,
                                exp->elts[pc + 2].doubleconst);
 
+    case OP_DECFLOAT:
+      (*pos) += 3;
+      return value_from_decfloat (exp->elts[pc + 1].type,
+                                 exp->elts[pc + 2].decfloatconst);
+
     case OP_VAR_VALUE:
       (*pos) += 3;
       if (noside == EVAL_SKIP)
@@ -500,16 +533,29 @@ evaluate_subexp_standard (struct type *expect_type,
 
     case OP_REGISTER:
       {
-       int regno = longest_to_int (exp->elts[pc + 1].longconst);
+       const char *name = &exp->elts[pc + 2].string;
+       int regno;
        struct value *val;
-       (*pos) += 2;
-       if (noside == EVAL_AVOID_SIDE_EFFECTS)
+
+       (*pos) += 3 + BYTES_TO_EXP_ELEM (exp->elts[pc + 1].longconst + 1);
+       regno = frame_map_name_to_regnum (deprecated_safe_get_selected_frame (),
+                                         name, strlen (name));
+       if (regno == -1)
+         error (_("Register $%s not available."), name);
+
+        /* In EVAL_AVOID_SIDE_EFFECTS mode, we only need to return
+           a value with the appropriate register type.  Unfortunately,
+           we don't have easy access to the type of user registers.
+           So for these registers, we fetch the register value regardless
+           of the evaluation mode.  */
+       if (noside == EVAL_AVOID_SIDE_EFFECTS
+           && regno < gdbarch_num_regs (current_gdbarch)
+              + gdbarch_num_pseudo_regs (current_gdbarch))
          val = value_zero (register_type (current_gdbarch, regno), not_lval);
        else
          val = value_of_register (regno, get_selected_frame (NULL));
        if (val == NULL)
-         error (_("Value of register %s not available."),
-                frame_map_regnum_to_name (get_selected_frame (NULL), regno));
+         error (_("Value of register %s not available."), name);
        else
          return val;
       }
@@ -678,7 +724,7 @@ evaluate_subexp_standard (struct type *expect_type,
              for (; range_low <= range_high; range_low++)
                {
                  int bit_index = (unsigned) range_low % TARGET_CHAR_BIT;
-                 if (BITS_BIG_ENDIAN)
+                 if (gdbarch_bits_big_endian (current_gdbarch))
                    bit_index = TARGET_CHAR_BIT - 1 - bit_index;
                  valaddr[(unsigned) range_low / TARGET_CHAR_BIT]
                    |= 1 << bit_index;
@@ -757,7 +803,6 @@ evaluate_subexp_standard (struct type *expect_type,
 
        CORE_ADDR selector = 0;
 
-       int using_gcc = 0;
        int struct_return = 0;
        int sub_no_side = 0;
 
@@ -903,29 +948,27 @@ evaluate_subexp_standard (struct type *expect_type,
          {
            struct block *b;
            CORE_ADDR funaddr;
-           struct type *value_type;
+           struct type *val_type;
 
-           funaddr = find_function_addr (method, &value_type);
+           funaddr = find_function_addr (method, &val_type);
 
            b = block_for_pc (funaddr);
 
-           /* If compiled without -g, assume GCC 2.  */
-           using_gcc = (b == NULL ? 2 : BLOCK_GCC_COMPILED (b));
-
-           CHECK_TYPEDEF (value_type);
+           CHECK_TYPEDEF (val_type);
          
-           if ((value_type == NULL) 
-               || (TYPE_CODE(value_type) == TYPE_CODE_ERROR))
+           if ((val_type == NULL) 
+               || (TYPE_CODE(val_type) == TYPE_CODE_ERROR))
              {
                if (expect_type != NULL)
-                 value_type = expect_type;
+                 val_type = expect_type;
              }
 
-           struct_return = using_struct_return (value_type, using_gcc);
+           struct_return = using_struct_return (value_type (method), val_type);
          }
        else if (expect_type != NULL)
          {
-           struct_return = using_struct_return (check_typedef (expect_type), using_gcc);
+           struct_return = using_struct_return (NULL,
+                                                check_typedef (expect_type));
          }
        
        /* Found a function symbol.  Now we will substitute its
@@ -1022,14 +1065,6 @@ evaluate_subexp_standard (struct type *expect_type,
       argvec = (struct value **) alloca (sizeof (struct value *) * (nargs + 3));
       if (op == STRUCTOP_MEMBER || op == STRUCTOP_MPTR)
        {
-         /* 1997-08-01 Currently we do not support function invocation
-            via pointers-to-methods with HP aCC. Pointer does not point
-            to the function, but possibly to some thunk. */
-         if (deprecated_hp_som_som_object_present)
-           {
-             error (_("Not implemented: function invocation through pointer to method with HP aCC"));
-           }
-
          nargs++;
          /* First, evaluate the structure into arg2 */
          pc2 = (*pos)++;
@@ -1415,14 +1450,6 @@ evaluate_subexp_standard (struct type *expect_type,
       switch (TYPE_CODE (type))
        {
        case TYPE_CODE_METHODPTR:
-         if (deprecated_hp_som_som_object_present)
-           {
-             /* With HP aCC, pointers to methods do not point to the
-                function code.  */
-             /* 1997-08-19 */
-             error (_("Pointers to methods not supported with HP aCC"));
-           }
-
          if (noside == EVAL_AVOID_SIDE_EFFECTS)
            return value_zero (TYPE_TARGET_TYPE (type), not_lval);
          else
@@ -1438,14 +1465,6 @@ evaluate_subexp_standard (struct type *expect_type,
                             arg1);
 
          mem_offset = value_as_long (arg2);
-         if (deprecated_hp_som_som_object_present)
-           {
-             /* HP aCC generates offsets that have bit #29 set; turn it off to get
-                a real offset to the member. */
-             if (!mem_offset)  /* no bias -> really null */
-               error (_("Attempted dereference of null pointer-to-member"));
-             mem_offset &= ~0x20000000;
-           }
 
          arg3 = value_from_pointer (lookup_pointer_type (TYPE_TARGET_TYPE (type)),
                                     value_as_long (arg1) + mem_offset);
@@ -1469,24 +1488,6 @@ evaluate_subexp_standard (struct type *expect_type,
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       arg2 = evaluate_subexp (value_type (arg1), exp, pos, noside);
 
-      /* Do special stuff for HP aCC pointers to members */
-      if (deprecated_hp_som_som_object_present)
-       {
-         /* 1997-08-19 Can't assign HP aCC pointers to methods. No details of
-            the implementation yet; but the pointer appears to point to a code
-            sequence (thunk) in memory -- in any case it is *not* the address
-            of the function as it would be in a naive implementation. */
-         if (TYPE_CODE (value_type (arg1)) == TYPE_CODE_METHODPTR)
-           error (_("Assignment to pointers to methods not implemented with HP aCC"));
-
-         /* HP aCC pointers to data members require a constant bias.  */
-         if (TYPE_CODE (value_type (arg1)) == TYPE_CODE_MEMBERPTR)
-           {
-             unsigned int *ptr = (unsigned int *) value_contents (arg2);       /* forces evaluation */
-             *ptr |= 0x20000000;       /* set 29th bit */
-           }
-       }
-
       if (noside == EVAL_SKIP || noside == EVAL_AVOID_SIDE_EFFECTS)
        return arg1;
       if (binop_user_defined_p (op, arg1, arg2))
@@ -1534,6 +1535,7 @@ evaluate_subexp_standard (struct type *expect_type,
     case BINOP_EXP:
     case BINOP_MUL:
     case BINOP_DIV:
+    case BINOP_INTDIV:
     case BINOP_REM:
     case BINOP_MOD:
     case BINOP_LSH:
@@ -1547,11 +1549,30 @@ evaluate_subexp_standard (struct type *expect_type,
        goto nosideret;
       if (binop_user_defined_p (op, arg1, arg2))
        return value_x_binop (arg1, arg2, op, OP_NULL, noside);
-      else if (noside == EVAL_AVOID_SIDE_EFFECTS
-              && (op == BINOP_DIV || op == BINOP_REM || op == BINOP_MOD))
-       return value_zero (value_type (arg1), not_lval);
       else
-       return value_binop (arg1, arg2, op);
+       {
+         /* If EVAL_AVOID_SIDE_EFFECTS and we're dividing by zero,
+            fudge arg2 to avoid division-by-zero, the caller is
+            (theoretically) only looking for the type of the result.  */
+         if (noside == EVAL_AVOID_SIDE_EFFECTS
+             /* ??? Do we really want to test for BINOP_MOD here?
+                The implementation of value_binop gives it a well-defined
+                value.  */
+             && (op == BINOP_DIV
+                 || op == BINOP_INTDIV
+                 || op == BINOP_REM
+                 || op == BINOP_MOD)
+             && value_logical_not (arg2))
+           {
+             struct value *v_one, *retval;
+
+             v_one = value_one (value_type (arg2), not_lval);
+             retval = value_binop (arg1, v_one, op);
+             return retval;
+           }
+         else
+           return value_binop (arg1, arg2, op);
+       }
 
     case BINOP_RANGE:
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
@@ -1730,7 +1751,7 @@ evaluate_subexp_standard (struct type *expect_type,
           returns the correct type value */
 
        deprecated_set_value_type (arg1, tmp_type);
-       return value_ind (value_add (value_coerce_array (arg1), arg2));
+       return value_subscripted_rvalue (arg1, arg2, 0);
       }
 
     case BINOP_LOGICAL_AND:
@@ -1978,13 +1999,6 @@ evaluate_subexp_standard (struct type *expect_type,
       else
        {
          struct value *retvalp = evaluate_subexp_for_address (exp, pos, noside);
-         /* If HP aCC object, use bias for pointers to members */
-         if (deprecated_hp_som_som_object_present
-             && TYPE_CODE (value_type (retvalp)) == TYPE_CODE_MEMBERPTR)
-           {
-             unsigned int *ptr = (unsigned int *) value_contents (retvalp);    /* forces evaluation */
-             *ptr |= 0x20000000;       /* set 29th bit */
-           }
          return retvalp;
        }
 
@@ -2188,18 +2202,19 @@ evaluate_subexp_for_address (struct expression *exp, int *pos,
 
          if (sym_class == LOC_CONST
              || sym_class == LOC_CONST_BYTES
-             || sym_class == LOC_REGISTER
-             || sym_class == LOC_REGPARM)
+             || sym_class == LOC_REGISTER)
            error (_("Attempt to take address of register or constant."));
 
          return
            value_zero (type, not_lval);
        }
-      else
+      else if (symbol_read_needs_frame (var))
        return
          locate_var_value
          (var,
           block_innermost_frame (exp->elts[pc + 1].block));
+      else
+       return locate_var_value (var, NULL);
 
     case OP_SCOPE:
       tem = longest_to_int (exp->elts[pc + 2].longconst);
@@ -2219,14 +2234,14 @@ evaluate_subexp_for_address (struct expression *exp, int *pos,
        {
          struct type *type = check_typedef (value_type (x));
 
-         if (VALUE_LVAL (x) == lval_memory)
+         if (VALUE_LVAL (x) == lval_memory || value_must_coerce_to_target (x))
            return value_zero (lookup_pointer_type (value_type (x)),
                               not_lval);
          else if (TYPE_CODE (type) == TYPE_CODE_REF)
            return value_zero (lookup_pointer_type (TYPE_TARGET_TYPE (type)),
                               not_lval);
          else
-           error (_("Attempt to take address of non-lval"));
+           error (_("Attempt to take address of value not located in memory."));
        }
       return value_addr (x);
     }
This page took 0.028543 seconds and 4 git commands to generate.