X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Feval.c;h=65631752d6714b9c4f19f3b15f78f9994cf013aa;hb=3bcbaac54041e1226ae28cf918d4f5daf1a899af;hp=71cd9282fecbebd94f1c291f68aa71dffde5aad8;hpb=5565b5569bf75adccb29b590f5433aeb9dda3314;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/eval.c b/gdb/eval.c index 71cd9282fe..65631752d6 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -1,6 +1,6 @@ /* Evaluate expressions for GDB. Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, - 1996, 1997, 1998, 1999, 2000 + 1996, 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is part of GDB. @@ -30,6 +30,7 @@ #include "frame.h" #include "language.h" /* For CAST_IS_CONVERSION */ #include "f-lang.h" /* for array bound stuff */ +#include "cp-abi.h" /* Defined in symtab.c */ extern int hp_som_som_object_present; @@ -43,28 +44,25 @@ extern int objectprint; /* Prototypes for local functions. */ -static value_ptr evaluate_subexp_for_sizeof (struct expression *, int *); +static struct value *evaluate_subexp_for_sizeof (struct expression *, int *); -static value_ptr evaluate_subexp_for_address (struct expression *, - int *, enum noside); +static struct value *evaluate_subexp_for_address (struct expression *, + int *, enum noside); -static value_ptr evaluate_subexp (struct type *, struct expression *, - int *, enum noside); +static struct value *evaluate_subexp (struct type *, struct expression *, + int *, enum noside); static char *get_label (struct expression *, int *); -static value_ptr -evaluate_struct_tuple (value_ptr, struct expression *, int *, - enum noside, int); +static struct value *evaluate_struct_tuple (struct value *, + struct expression *, int *, + enum noside, int); -static LONGEST -init_array_element (value_ptr, value_ptr, struct expression *, - int *, enum noside, LONGEST, LONGEST); +static LONGEST init_array_element (struct value *, struct value *, + struct expression *, int *, enum noside, + LONGEST, LONGEST); -#if defined (__GNUC__) && !__STDC__ -inline -#endif -static value_ptr +static struct value * evaluate_subexp (struct type *expect_type, register struct expression *exp, register int *pos, enum noside noside) { @@ -80,9 +78,9 @@ parse_and_eval_address (char *exp) struct expression *expr = parse_expression (exp); register CORE_ADDR addr; register struct cleanup *old_chain = - make_cleanup (free_current_contents, &expr); + make_cleanup (free_current_contents, &expr); - addr = value_as_pointer (evaluate_expression (expr)); + addr = value_as_address (evaluate_expression (expr)); do_cleanups (old_chain); return addr; } @@ -96,9 +94,9 @@ parse_and_eval_address_1 (char **expptr) struct expression *expr = parse_exp_1 (expptr, (struct block *) 0, 0); register CORE_ADDR addr; register struct cleanup *old_chain = - make_cleanup (free_current_contents, &expr); + make_cleanup (free_current_contents, &expr); - addr = value_as_pointer (evaluate_expression (expr)); + addr = value_as_address (evaluate_expression (expr)); do_cleanups (old_chain); return addr; } @@ -118,13 +116,13 @@ parse_and_eval_long (char *exp) return (retval); } -value_ptr +struct value * parse_and_eval (char *exp) { struct expression *expr = parse_expression (exp); - register value_ptr val; - register struct cleanup *old_chain - = make_cleanup (free_current_contents, &expr); + struct value *val; + register struct cleanup *old_chain = + make_cleanup (free_current_contents, &expr); val = evaluate_expression (expr); do_cleanups (old_chain); @@ -135,13 +133,13 @@ parse_and_eval (char *exp) in the string EXPP as an expression, evaluate it, and return the value. EXPP is advanced to point to the comma. */ -value_ptr +struct value * parse_to_comma_and_eval (char **expp) { struct expression *expr = parse_exp_1 (expp, (struct block *) 0, 1); - register value_ptr val; - register struct cleanup *old_chain - = make_cleanup (free_current_contents, &expr); + struct value *val; + register struct cleanup *old_chain = + make_cleanup (free_current_contents, &expr); val = evaluate_expression (expr); do_cleanups (old_chain); @@ -153,7 +151,7 @@ parse_to_comma_and_eval (char **expp) See expression.h for info on the format of an expression. */ -value_ptr +struct value * evaluate_expression (struct expression *exp) { int pc = 0; @@ -163,7 +161,7 @@ evaluate_expression (struct expression *exp) /* Evaluate an expression, avoiding all memory references and getting a value whose type alone is correct. */ -value_ptr +struct value * evaluate_type (struct expression *exp) { int pc = 0; @@ -188,11 +186,12 @@ get_label (register struct expression *exp, int *pos) return NULL; } -/* This function evaluates tuples (in Chill) or brace-initializers - (in C/C++) for structure types. */ +/* This function evaluates tuples (in (OBSOLETE) Chill) or + brace-initializers (in C/C++) for structure types. */ -static value_ptr -evaluate_struct_tuple (value_ptr struct_val, register struct expression *exp, +static struct value * +evaluate_struct_tuple (struct value *struct_val, + register struct expression *exp, register int *pos, enum noside noside, int nargs) { struct type *struct_type = check_typedef (VALUE_TYPE (struct_val)); @@ -204,7 +203,7 @@ evaluate_struct_tuple (value_ptr struct_val, register struct expression *exp, while (--nargs >= 0) { int pc = *pos; - value_ptr val = NULL; + struct value *val = NULL; int nlabels = 0; int bitpos, bitsize; char *addr; @@ -326,16 +325,14 @@ evaluate_struct_tuple (value_ptr struct_val, register struct expression *exp, return struct_val; } -/* Recursive helper function for setting elements of array tuples for 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 for + (OBSOLETE) 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. */ static LONGEST -init_array_element (value_ptr array, value_ptr element, +init_array_element (struct value *array, struct value *element, register struct expression *exp, register int *pos, enum noside noside, LONGEST low_bound, LONGEST high_bound) { @@ -375,7 +372,7 @@ init_array_element (value_ptr array, value_ptr element, return index; } -value_ptr +struct value * evaluate_subexp_standard (struct type *expect_type, register struct expression *exp, register int *pos, enum noside noside) @@ -383,10 +380,12 @@ evaluate_subexp_standard (struct type *expect_type, enum exp_opcode op; int tem, tem2, tem3; register int pc, pc2 = 0, oldpos; - register value_ptr arg1 = NULL, arg2 = NULL, arg3; + struct value *arg1 = NULL; + struct value *arg2 = NULL; + struct value *arg3; struct type *type; int nargs; - value_ptr *argvec; + struct value **argvec; int upper, lower, retcode; int code; int ix; @@ -446,11 +445,11 @@ evaluate_subexp_standard (struct type *expect_type, case OP_REGISTER: { int regno = longest_to_int (exp->elts[pc + 1].longconst); - value_ptr val = value_of_register (regno); - + struct value *val = value_of_register (regno, deprecated_selected_frame); (*pos) += 2; if (val == NULL) - error ("Value of register %s not available.", REGISTER_NAME (regno)); + error ("Value of register %s not available.", + frame_map_regnum_to_name (regno)); else return val; } @@ -489,7 +488,7 @@ evaluate_subexp_standard (struct type *expect_type, if (expect_type != NULL_TYPE && noside != EVAL_SKIP && TYPE_CODE (type) == TYPE_CODE_STRUCT) { - value_ptr rec = allocate_value (expect_type); + struct value *rec = allocate_value (expect_type); memset (VALUE_CONTENTS_RAW (rec), '\0', TYPE_LENGTH (type)); return evaluate_struct_tuple (rec, exp, pos, noside, nargs); } @@ -499,7 +498,7 @@ evaluate_subexp_standard (struct type *expect_type, { struct type *range_type = TYPE_FIELD_TYPE (type, 0); struct type *element_type = TYPE_TARGET_TYPE (type); - value_ptr array = allocate_value (expect_type); + struct value *array = allocate_value (expect_type); int element_size = TYPE_LENGTH (check_typedef (element_type)); LONGEST low_bound, high_bound, index; if (get_discrete_bounds (range_type, &low_bound, &high_bound) < 0) @@ -511,7 +510,7 @@ evaluate_subexp_standard (struct type *expect_type, memset (VALUE_CONTENTS_RAW (array), 0, TYPE_LENGTH (expect_type)); for (tem = nargs; --nargs >= 0;) { - value_ptr element; + struct value *element; int index_pc = 0; if (exp->elts[*pos].opcode == BINOP_RANGE) { @@ -547,7 +546,7 @@ evaluate_subexp_standard (struct type *expect_type, if (expect_type != NULL_TYPE && noside != EVAL_SKIP && TYPE_CODE (type) == TYPE_CODE_SET) { - value_ptr set = allocate_value (expect_type); + struct value *set = allocate_value (expect_type); char *valaddr = VALUE_CONTENTS_RAW (set); struct type *element_type = TYPE_INDEX_TYPE (type); struct type *check_type = element_type; @@ -565,7 +564,7 @@ evaluate_subexp_standard (struct type *expect_type, { LONGEST range_low, range_high; struct type *range_low_type, *range_high_type; - value_ptr elem_val; + struct value *elem_val; if (exp->elts[*pos].opcode == BINOP_RANGE) { (*pos)++; @@ -619,7 +618,7 @@ evaluate_subexp_standard (struct type *expect_type, return set; } - argvec = (value_ptr *) alloca (sizeof (value_ptr) * nargs); + argvec = (struct value **) alloca (sizeof (struct value *) * nargs); for (tem = 0; tem < nargs; tem++) { /* Ensure that array expressions are coerced into pointer objects. */ @@ -631,7 +630,7 @@ evaluate_subexp_standard (struct type *expect_type, case TERNOP_SLICE: { - value_ptr array = evaluate_subexp (NULL_TYPE, exp, pos, noside); + struct value *array = evaluate_subexp (NULL_TYPE, exp, pos, noside); int lowbound = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside)); int upper @@ -643,7 +642,7 @@ evaluate_subexp_standard (struct type *expect_type, case TERNOP_SLICE_COUNT: { - value_ptr array = evaluate_subexp (NULL_TYPE, exp, pos, noside); + struct value *array = evaluate_subexp (NULL_TYPE, exp, pos, noside); int lowbound = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside)); int length @@ -672,7 +671,7 @@ evaluate_subexp_standard (struct type *expect_type, nargs = longest_to_int (exp->elts[pc + 1].longconst); /* Allocate arg vector, including space for the function to be called in argvec[0] and a terminating NULL */ - argvec = (value_ptr *) alloca (sizeof (value_ptr) * (nargs + 3)); + argvec = (struct value **) alloca (sizeof (struct value *) * (nargs + 3)); if (op == STRUCTOP_MEMBER || op == STRUCTOP_MPTR) { LONGEST fnptr; @@ -730,7 +729,7 @@ evaluate_subexp_standard (struct type *expect_type, for (j = TYPE_FN_FIELDLIST_LENGTH (basetype, i) - 1; j >= 0; --j) if ((int) TYPE_FN_FIELD_VOFFSET (f, j) == fnoffset) { - value_ptr temp = value_ind (arg2); + struct value *temp = value_ind (arg2); arg1 = value_virtual_fn_field (&temp, f, j, domain_type, 0); arg2 = value_addr (temp); goto got_it; @@ -820,31 +819,26 @@ evaluate_subexp_standard (struct type *expect_type, if (op == STRUCTOP_STRUCT || op == STRUCTOP_PTR) { int static_memfuncp; - value_ptr temp = arg2; char tstr[256]; /* Method invocation : stuff "this" as first parameter */ - /* pai: this used to have lookup_pointer_type for some reason, - * but temp is already a pointer to the object */ - argvec[1] - = value_from_pointer (VALUE_TYPE (temp), - VALUE_ADDRESS (temp) + VALUE_OFFSET (temp)); + argvec[1] = arg2; /* Name of method from expression */ strcpy (tstr, &exp->elts[pc2 + 2].string); if (overload_resolution && (exp->language_defn->la_language == language_cplus)) { /* Language is C++, do some overload resolution before evaluation */ - value_ptr valp = NULL; + struct value *valp = NULL; /* Prepare list of argument types for overload resolution */ - arg_types = (struct type **) xmalloc (nargs * (sizeof (struct type *))); + arg_types = (struct type **) alloca (nargs * (sizeof (struct type *))); for (ix = 1; ix <= nargs; ix++) arg_types[ix - 1] = VALUE_TYPE (argvec[ix]); (void) find_overload_match (arg_types, nargs, tstr, 1 /* method */ , 0 /* strict match */ , - arg2 /* the object */ , NULL, + &arg2 /* the object */ , NULL, &valp, NULL, &static_memfuncp); @@ -854,11 +848,17 @@ evaluate_subexp_standard (struct type *expect_type, else /* Non-C++ case -- or no overload resolution */ { - temp = arg2; + struct value *temp = arg2; argvec[0] = value_struct_elt (&temp, argvec + 1, tstr, &static_memfuncp, op == STRUCTOP_STRUCT ? "structure" : "structure pointer"); + /* value_struct_elt updates temp with the correct value + of the ``this'' pointer if necessary, so modify argvec[1] to + reflect any ``this'' changes. */ + arg2 = value_from_longest (lookup_pointer_type(VALUE_TYPE (temp)), + VALUE_ADDRESS (temp) + VALUE_OFFSET (temp) + + VALUE_EMBEDDED_OFFSET (temp)); argvec[1] = arg2; /* the ``this'' pointer */ } @@ -887,7 +887,7 @@ evaluate_subexp_standard (struct type *expect_type, struct symbol *symp; /* Prepare list of argument types for overload resolution */ - arg_types = (struct type **) xmalloc (nargs * (sizeof (struct type *))); + arg_types = (struct type **) alloca (nargs * (sizeof (struct type *))); for (ix = 1; ix <= nargs; ix++) arg_types[ix - 1] = VALUE_TYPE (argvec[ix]); @@ -916,6 +916,8 @@ evaluate_subexp_standard (struct type *expect_type, if (noside == EVAL_SKIP) goto nosideret; + if (argvec[0] == NULL) + 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 @@ -933,8 +935,6 @@ evaluate_subexp_standard (struct type *expect_type, else error ("Expression of type other than \"Function returning ...\" used as function"); } - if (argvec[0] == NULL) - error ("Cannot evaluate function -- may be inlined"); 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 */ @@ -968,7 +968,7 @@ evaluate_subexp_standard (struct type *expect_type, /* It's a function call. */ /* Allocate arg vector, including space for the function to be called in argvec[0] and a terminating NULL */ - argvec = (value_ptr *) alloca (sizeof (value_ptr) * (nargs + 2)); + argvec = (struct value **) alloca (sizeof (struct value *) * (nargs + 2)); argvec[0] = arg1; tem = 1; for (; tem <= nargs; tem++) @@ -1022,7 +1022,7 @@ evaluate_subexp_standard (struct type *expect_type, lval_memory); else { - value_ptr temp = arg1; + struct value *temp = arg1; return value_struct_elt (&temp, NULL, &exp->elts[pc + 2].string, NULL, "structure"); } @@ -1065,7 +1065,7 @@ evaluate_subexp_standard (struct type *expect_type, lval_memory); else { - value_ptr temp = arg1; + struct value *temp = arg1; return value_struct_elt (&temp, NULL, &exp->elts[pc + 2].string, NULL, "structure pointer"); } @@ -1639,7 +1639,7 @@ evaluate_subexp_standard (struct type *expect_type, } else { - value_ptr retvalp = evaluate_subexp_for_address (exp, pos, noside); + struct value *retvalp = evaluate_subexp_for_address (exp, pos, noside); /* If HP aCC object, use bias for pointers to members */ if (hp_som_som_object_present && (TYPE_CODE (VALUE_TYPE (retvalp)) == TYPE_CODE_PTR) && @@ -1678,7 +1678,7 @@ evaluate_subexp_standard (struct type *expect_type, return value_zero (exp->elts[pc + 1].type, lval_memory); else return value_at_lazy (exp->elts[pc + 1].type, - value_as_pointer (arg1), + value_as_address (arg1), NULL); case UNOP_PREINCREMENT: @@ -1775,7 +1775,7 @@ nosideret: NOSIDE may be EVAL_AVOID_SIDE_EFFECTS; then only the type of the result need be correct. */ -static value_ptr +static struct value * evaluate_subexp_for_address (register struct expression *exp, register int *pos, enum noside noside) { @@ -1831,7 +1831,7 @@ evaluate_subexp_for_address (register struct expression *exp, register int *pos, default_case: if (noside == EVAL_AVOID_SIDE_EFFECTS) { - value_ptr x = evaluate_subexp (NULL_TYPE, exp, pos, noside); + struct value *x = evaluate_subexp (NULL_TYPE, exp, pos, noside); if (VALUE_LVAL (x) == lval_memory) return value_zero (lookup_pointer_type (VALUE_TYPE (x)), not_lval); @@ -1855,13 +1855,13 @@ evaluate_subexp_for_address (register struct expression *exp, register int *pos, */ -value_ptr +struct value * evaluate_subexp_with_coercion (register struct expression *exp, register int *pos, enum noside noside) { register enum exp_opcode op; register int pc; - register value_ptr val; + struct value *val; struct symbol *var; pc = (*pos); @@ -1892,13 +1892,13 @@ evaluate_subexp_with_coercion (register struct expression *exp, and return a value for the size of that subexpression. Advance *POS over the subexpression. */ -static value_ptr +static struct value * evaluate_subexp_for_sizeof (register struct expression *exp, register int *pos) { enum exp_opcode op; register int pc; struct type *type; - value_ptr val; + struct value *val; pc = (*pos); op = exp->elts[pc].opcode;