* infrun.c (IN_SOLIB_TRAMPOLINE): Correct comment, trampolines
[binutils-gdb.git] / gdb / expression.h
index 0fac7be1d12ded3a30a3fa56606c26921fbb0391..8c34642a35ad67af7215ab2181092be0c28bd556 100644 (file)
@@ -1,22 +1,28 @@
 /* Definitions for expressions stored in reversed prefix form, for GDB.
-   Copyright (C) 1986 Free Software Foundation, Inc.
+   Copyright 1986, 1989, 1992 Free Software Foundation, Inc.
 
-GDB is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY.  No author or distributor accepts responsibility to anyone
-for the consequences of using it or for whether it serves any
-particular purpose or works at all, unless he says so in writing.
-Refer to the GDB General Public License for full details.
+This file is part of GDB.
 
-Everyone is granted permission to copy, modify and redistribute GDB,
-but only under the conditions described in the GDB General Public
-License.  A copy of this license is supposed to have been given to you
-along with GDB so you can know your rights and responsibilities.  It
-should be in a file named COPYING.  Among other things, the copyright
-notice and this notice must be preserved on all copies.
+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
+(at your option) any later version.
 
-In other words, go ahead and share GDB, but don't try to stop
-anyone else from sharing it farther.  Help stamp out software hoarding!
-*/
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+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.  */
+
+#if !defined (EXPRESSION_H)
+#define EXPRESSION_H 1
+
+#ifdef __STDC__
+struct block;  /* Forward declaration for prototypes */
+#endif
 
 /* Definitions for saved C expressions.  */
 
@@ -35,6 +41,10 @@ anyone else from sharing it farther.  Help stamp out software hoarding!
 
 enum exp_opcode
 {
+  /* Used when it's necessary to pass an opcode which will be ignored,
+     or to catch uninitialized values.  */
+  OP_NULL,
+
 /* BINOP_... operate on two values computed by following subexpressions,
    replacing them by one result value.  They take no immediate arguments.  */
   BINOP_ADD,           /* + */
@@ -42,13 +52,14 @@ enum exp_opcode
   BINOP_MUL,           /* * */
   BINOP_DIV,           /* / */
   BINOP_REM,           /* % */
+  BINOP_MOD,           /* mod (Knuth 1.2.4) */
   BINOP_LSH,           /* << */
   BINOP_RSH,           /* >> */
-  BINOP_AND,           /* && */
-  BINOP_OR,            /* || */
-  BINOP_LOGAND,                /* & */
-  BINOP_LOGIOR,                /* | */
-  BINOP_LOGXOR,                /* ^ */
+  BINOP_LOGICAL_AND,   /* && */
+  BINOP_LOGICAL_OR,    /* || */
+  BINOP_BITWISE_AND,   /* & */
+  BINOP_BITWISE_IOR,   /* | */
+  BINOP_BITWISE_XOR,   /* ^ */
   BINOP_EQUAL,         /* == */
   BINOP_NOTEQUAL,      /* != */
   BINOP_LESS,          /* < */
@@ -74,7 +85,8 @@ enum exp_opcode
   STRUCTOP_MPTR,
 /* end of C++.  */
 
-  BINOP_END,
+  /* For Modula-2 integer division DIV */
+  BINOP_INTDIV,
 
   BINOP_ASSIGN_MODIFY, /* +=, -=, *=, and so on.
                           The following exp_element is another opcode,
@@ -82,9 +94,25 @@ enum exp_opcode
                           Then comes another BINOP_ASSIGN_MODIFY,
                           making three exp_elements in total.  */
 
+  /* Modula-2 standard (binary) procedures*/
+  BINOP_VAL,
+  BINOP_INCL,
+  BINOP_EXCL,
+
+  /* This must be the highest BINOP_ value, for expprint.c.  */
+  BINOP_END,
+
 /* Operates on three values computed by following subexpressions.  */
   TERNOP_COND,         /* ?: */
 
+/* Multidimensional subscript operator, such as Modula-2 x[a,b,...].
+   The dimensionality is encoded in the operator, like the number of
+   function arguments in OP_FUNCALL, I.E. <OP><dimension><OP>.
+   The value of the first following subexpression is subscripted
+   by each of the next following subexpressions, one per dimension. */
+
+   MULTI_SUBSCRIPT,
+
 /* The OP_... series take immediate following arguments.
    After the arguments come another OP_... (the same one)
    so that the grouping can be recognized from the end.  */
@@ -137,8 +165,8 @@ enum exp_opcode
 /* UNOP_... operate on one value from a following subexpression
    and replace it with a result.  They take no immediate arguments.  */
   UNOP_NEG,            /* Unary - */
-  UNOP_ZEROP,          /* Unary ! */
-  UNOP_LOGNOT,         /* Unary ~ */
+  UNOP_LOGICAL_NOT,    /* Unary ! */
+  UNOP_COMPLEMENT,     /* Unary ~ */
   UNOP_IND,            /* Unary * */
   UNOP_ADDR,           /* Unary & */
   UNOP_PREINCREMENT,   /* ++ before an expression */
@@ -147,6 +175,22 @@ enum exp_opcode
   UNOP_POSTDECREMENT,  /* -- after an expression */
   UNOP_SIZEOF,         /* Unary sizeof (followed by expression) */
 
+  UNOP_PLUS,           /* Unary plus */
+
+  UNOP_CAP,            /* Modula-2 standard (unary) procedures */
+  UNOP_CHR,
+  UNOP_ORD,
+  UNOP_ABS,
+  UNOP_FLOAT,
+  UNOP_HIGH,
+  UNOP_MAX,
+  UNOP_MIN,
+  UNOP_ODD,
+  UNOP_TRUNC,
+
+  OP_BOOL,             /* Modula-2 builtin BOOLEAN type */
+  OP_M2_STRING,                /* Modula-2 string constants */
+
 /* STRUCTOP_... operate on a value from a following subexpression
    by extracting a structure component specified by a string
    that appears in the following exp_elements (as many as needed).
@@ -169,13 +213,17 @@ enum exp_opcode
      a string, which, of course, is variable length.  */
   OP_SCOPE,
 
+  /* OP_TYPE is for parsing types, and used with the "ptype" command
+     so we can look up types that are qualified by scope, either with
+     the GDB "::" operator, or the Modula-2 '.' operator. */
+  OP_TYPE
 };
 
 union exp_element
 {
   enum exp_opcode opcode;
   struct symbol *symbol;
-  long longconst;
+  LONGEST longconst;
   double doubleconst;
   char string;
   struct type *type;
@@ -184,9 +232,43 @@ union exp_element
 
 struct expression
 {
+  const struct language_defn *language_defn;  /* language it was entered in */
   int nelts;
   union exp_element elts[1];
 };
 
-struct expression *parse_c_expression ();
-struct expression *parse_c_1 ();
+/* From parse.c */
+
+extern struct expression *
+parse_expression PARAMS ((char *));
+
+extern struct expression *
+parse_exp_1 PARAMS ((char **, struct block *, int));
+
+/* 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_<whatever>, then look at it.  */
+extern struct block *innermost_block;
+
+/* From expprint.c */
+
+extern void
+print_expression PARAMS ((struct expression *, FILE *));
+
+extern char *
+op_string PARAMS ((enum exp_opcode));
+
+/* To enable dumping of all parsed expressions in a human readable
+   form, define DEBUG_EXPRESSIONS.  This is a compile time constant
+   at the moment, since it's not clear that this feature is important
+   enough to include by default. */
+
+#ifdef DEBUG_EXPRESSIONS
+extern void
+dump_expression PARAMS ((struct expression *, FILE *, char *));
+#define DUMP_EXPRESSION(exp,file,note) dump_expression ((exp), (file), (note))
+#else
+#define DUMP_EXPRESSION(exp,file,note) /* Null expansion */
+#endif /* DEBUG_EXPRESSIONS */
+
+#endif /* !defined (EXPRESSION_H) */