X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fexpression.h;h=12163e3949eaf9a271dcce9df7e3dc890fbbe405;hb=7feb7d068ae65557ede03c36468ebac61b0939ca;hp=da95fcbcf6215d6599e927fc0486b8dacca89a81;hpb=a2867626c13e9fe67881cc79e4ae6ff4f193fc04;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/expression.h b/gdb/expression.h index da95fcbcf6..12163e3949 100644 --- a/gdb/expression.h +++ b/gdb/expression.h @@ -1,13 +1,13 @@ /* Definitions for expressions stored in reversed prefix form, for GDB. - Copyright 1986, 1989, 1992, 1994, 2000, 2003 Free Software - Foundation, Inc. + Copyright (C) 1986, 1989, 1992, 1994, 2000, 2003, 2005, 2007, 2008, 2009 + 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, @@ -16,9 +16,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., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ #if !defined (EXPRESSION_H) #define EXPRESSION_H 1 @@ -166,9 +164,8 @@ enum exp_opcode With another OP_LAST at the end, this makes three exp_elements. */ OP_LAST, - /* OP_REGISTER is followed by an integer in the next exp_element. - This is the number of a register to fetch (as an int). - With another OP_REGISTER at the end, this makes three exp_elements. */ + /* OP_REGISTER is followed by a string in the next exp_element. + This is the name of a register to fetch. */ OP_REGISTER, /* OP_INTERNALVAR is followed by an internalvar ptr in the next exp_element. @@ -192,12 +189,13 @@ enum exp_opcode /* This is EXACTLY like OP_FUNCALL but is semantically different. In F77, array subscript expressions, substring expressions and function calls are all exactly the same syntactically. They may - only be dismabiguated at runtime. Thus this operator, which + only be disambiguated at runtime. Thus this operator, which indicates that we have found something of the form ( ) */ OP_F77_UNDETERMINED_ARGLIST, - /* The following OP is a special one, it introduces a F77 complex - literal. It is followed by exactly two args that are doubles. */ + /* OP_COMPLEX takes a type in the following element, followed by another + OP_COMPLEX, making three exp_elements. It is followed by two double + args, and converts them into a complex number of the given type. */ OP_COMPLEX, /* OP_STRING represents a string constant. @@ -234,6 +232,13 @@ enum exp_opcode following subexpression. */ UNOP_MEMVAL, + /* UNOP_MEMVAL_TLS is followed by a `struct objfile' pointer in the next + exp_element and a type pointer in the following exp_element. + With another UNOP_MEMVAL_TLS at the end, this makes four exp_elements. + It casts the contents of the word offsetted by the value of the + following subexpression from the TLS specified by `struct objfile'. */ + UNOP_MEMVAL_TLS, + /* UNOP_... operate on one value from a following subexpression and replace it with a result. They take no immediate arguments. */ @@ -318,11 +323,36 @@ enum exp_opcode /* An un-looked-up identifier. */ OP_NAME, - /* An unparsed expression. Used for Scheme (for now at least) */ - OP_EXPRSTRING, - /* An Objective C Foundation Class NSString constant */ - OP_OBJC_NSSTRING + OP_OBJC_NSSTRING, + + /* A F90 array range operator (for "exp:exp", "exp:", ":exp" and ":"). */ + OP_F90_RANGE, + + /* OP_DECFLOAT is followed by a type pointer in the next exp_element + and a dec long constant value in the following exp_element. + Then comes another OP_DECFLOAT. */ + OP_DECFLOAT, + + /* First extension operator. Individual language modules define + extra operators they need as constants with values + OP_LANGUAGE_SPECIFIC0 + k, for k >= 0, using a separate + enumerated type definition: + enum foo_extension_operator { + BINOP_MOGRIFY = OP_EXTENDED0, + BINOP_FROB, + ... + }; */ + OP_EXTENDED0, + + /* Last possible extension operator. Defined to provide an + explicit and finite number of extended operators. */ + OP_EXTENDED_LAST = 0xff + /* NOTE: Eventually, we expect to convert to an object-oriented + formulation for expression operators that does away with the + need for these extension operators, and indeed for this + entire enumeration type. Therefore, consider the OP_EXTENDED + definitions to be a temporary measure. */ }; union exp_element @@ -331,17 +361,20 @@ union exp_element struct symbol *symbol; LONGEST longconst; DOUBLEST doubleconst; + gdb_byte decfloatconst[16]; /* Really sizeof (union exp_element) characters (or less for the last element of a string). */ char string; struct type *type; struct internalvar *internalvar; struct block *block; + struct objfile *objfile; }; struct expression { const struct language_defn *language_defn; /* language it was entered in */ + struct gdbarch *gdbarch; /* architecture it was parsed in */ int nelts; union exp_element elts[1]; }; @@ -358,8 +391,14 @@ struct expression extern struct expression *parse_expression (char *); +extern struct type *parse_field_expression (char *, char **); + extern struct expression *parse_exp_1 (char **, struct block *, int); +/* For use by parsers; set if we want to parse an expression and + attempt to complete a field name. */ +extern int in_parse_field; + /* The innermost context required by the stack and register variables we've encountered so far. To use this, set it to NULL, then call parse_, then look at it. */ @@ -393,11 +432,7 @@ extern void print_expression (struct expression *, struct ui_file *); extern char *op_string (enum exp_opcode); -extern void dump_prefix_expression (struct expression *, - struct ui_file *, - char *); -extern void dump_postfix_expression (struct expression *, - struct ui_file *, - char *); +extern void dump_raw_expression (struct expression *, struct ui_file *, char *); +extern void dump_prefix_expression (struct expression *, struct ui_file *); #endif /* !defined (EXPRESSION_H) */