X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fparse.c;h=7d458c12a3b2a769b850d72a0a774220cca865be;hb=f727efb55dd1bcb4fff85b16251e2281e605d0c3;hp=4b7d541e0b578b73db9a0becc8367bbc60f09433;hpb=eedb3363e8cbb6a6845cf93850f116f6b6cf9ede;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/parse.c b/gdb/parse.c index 4b7d541e0b..7d458c12a3 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -17,7 +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., 675 Mass Ave, Cambridge, MA 02139, USA. */ +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Parse an expression from text in a string, and return the result as a struct expression pointer. @@ -29,7 +29,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ come first in the result. */ #include "defs.h" -#include +#include "gdb_string.h" #include "symtab.h" #include "gdbtypes.h" #include "frame.h" @@ -215,7 +215,7 @@ write_exp_elt_longcst (expelt) void write_exp_elt_dblcst (expelt) - double expelt; + DOUBLEST expelt; { union exp_element tmp; @@ -399,6 +399,97 @@ write_exp_msymbol (msymbol, text_symbol_type, data_symbol_type) write_exp_elt_opcode (UNOP_MEMVAL); } +/* Recognize tokens that start with '$'. These include: + + $regname A native register name or a "standard + register name". + + $variable A convenience variable with a name chosen + by the user. + + $digits Value history with index , starting + from the first value which has index 1. + + $$digits Value history with index relative + to the last value. I.E. $$0 is the last + value, $$1 is the one previous to that, $$2 + is the one previous to $$1, etc. + + $ | $0 | $$0 The last value in the value history. + + $$ An abbreviation for the second to the last + value in the value history, I.E. $$1 + + */ + +void +write_dollar_variable (str) + struct stoken str; +{ + /* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1) + and $$digits (equivalent to $<-digits> if you could type that). */ + + int negate = 0; + int i = 1; + /* Double dollar means negate the number and add -1 as well. + Thus $$ alone means -1. */ + if (str.length >= 2 && str.ptr[1] == '$') + { + negate = 1; + i = 2; + } + if (i == str.length) + { + /* Just dollars (one or two) */ + i = - negate; + goto handle_last; + } + /* Is the rest of the token digits? */ + for (; i < str.length; i++) + if (!(str.ptr[i] >= '0' && str.ptr[i] <= '9')) + break; + if (i == str.length) + { + i = atoi (str.ptr + 1 + negate); + if (negate) + i = - i; + goto handle_last; + } + + /* Handle tokens that refer to machine registers: + $ followed by a register name. */ + for (i = 0; i < NUM_REGS; i++) + if (str.length - 1 == strlen (reg_names[i]) + && STREQN (str.ptr + 1, reg_names[i], str.length - 1)) + { + goto handle_register; + } + for (i = 0; i < num_std_regs; i++) + if (str.length - 1 == strlen (std_regs[i].name) + && STREQN (str.ptr + 1, std_regs[i].name, str.length - 1)) + { + i = std_regs[i].regnum; + goto handle_register; + } + + /* Any other names starting in $ are debugger internal variables. */ + + write_exp_elt_opcode (OP_INTERNALVAR); + write_exp_elt_intern (lookup_internalvar (copy_name (str) + 1)); + write_exp_elt_opcode (OP_INTERNALVAR); + return; + handle_last: + write_exp_elt_opcode (OP_LAST); + write_exp_elt_longcst ((LONGEST) i); + write_exp_elt_opcode (OP_LAST); + return; + handle_register: + write_exp_elt_opcode (OP_REGISTER); + write_exp_elt_longcst (i); + write_exp_elt_opcode (OP_REGISTER); + return; +} + /* Return a null-terminated temporary copy of the name of a string token. */ @@ -470,12 +561,7 @@ length_of_subexp (expr, endpos) oplen = 3; break; - case OP_F77_LITERAL_COMPLEX: - oplen = 1; - args = 2; - break; - - case OP_F77_SUBSTR: + case OP_COMPLEX: oplen = 1; args = 2; break; @@ -510,12 +596,20 @@ length_of_subexp (expr, endpos) args = 1; break; + case OP_LABELED: case STRUCTOP_STRUCT: case STRUCTOP_PTR: +/* start-sanitize-gm */ +#ifdef GENERAL_MAGIC + case STRUCTOP_FIELD: +#endif /* GENERAL_MAGIC */ +/* end-sanitize-gm */ args = 1; /* fall through */ case OP_M2_STRING: case OP_STRING: + case OP_NAME: + case OP_EXPRSTRING: oplen = longest_to_int (expr->elts[endpos - 2].longconst); oplen = 4 + BYTES_TO_EXP_ELEM (oplen + 1); break; @@ -534,13 +628,13 @@ length_of_subexp (expr, endpos) break; case TERNOP_COND: + case TERNOP_SLICE: + case TERNOP_SLICE_COUNT: args = 3; break; /* Modula-2 */ case MULTI_SUBSCRIPT: - /* Fortran */ - case MULTI_F77_SUBSCRIPT: oplen = 3; args = 1 + longest_to_int (expr->elts[endpos- 2].longconst); break; @@ -612,12 +706,7 @@ prefixify_subexp (inexpr, outexpr, inend, outbeg) oplen = 3; break; - case OP_F77_LITERAL_COMPLEX: - oplen = 1; - args = 2; - break; - - case OP_F77_SUBSTR: + case OP_COMPLEX: oplen = 1; args = 2; break; @@ -653,10 +742,13 @@ prefixify_subexp (inexpr, outexpr, inend, outbeg) case STRUCTOP_STRUCT: case STRUCTOP_PTR: + case OP_LABELED: args = 1; /* fall through */ case OP_M2_STRING: case OP_STRING: + case OP_NAME: + case OP_EXPRSTRING: oplen = longest_to_int (inexpr->elts[inend - 2].longconst); oplen = 4 + BYTES_TO_EXP_ELEM (oplen + 1); break; @@ -675,6 +767,8 @@ prefixify_subexp (inexpr, outexpr, inend, outbeg) break; case TERNOP_COND: + case TERNOP_SLICE: + case TERNOP_SLICE_COUNT: args = 3; break; @@ -685,8 +779,6 @@ prefixify_subexp (inexpr, outexpr, inend, outbeg) /* Modula-2 */ case MULTI_SUBSCRIPT: - /* Fortran */ - case MULTI_F77_SUBSCRIPT: oplen = 3; args = 1 + longest_to_int (inexpr->elts[inend - 2].longconst); break; @@ -883,20 +975,22 @@ follow_types (follow_type) break; case tp_array: array_size = pop_type_int (); - if (array_size != -1) - { - range_type = - create_range_type ((struct type *) NULL, - builtin_type_int, 0, - array_size - 1); - follow_type = - create_array_type ((struct type *) NULL, - follow_type, range_type); - } - else - follow_type = lookup_pointer_type (follow_type); + /* FIXME-type-allocation: need a way to free this type when we are + done with it. */ + range_type = + create_range_type ((struct type *) NULL, + builtin_type_int, 0, + array_size >= 0 ? array_size - 1 : 0); + follow_type = + create_array_type ((struct type *) NULL, + follow_type, range_type); + if (array_size < 0) + TYPE_ARRAY_UPPER_BOUND_TYPE(follow_type) + = BOUND_CANNOT_BE_DETERMINED; break; case tp_function: + /* FIXME-type-allocation: need a way to free this type when we are + done with it. */ follow_type = lookup_function_type (follow_type); break; }