Fix snafu in aarch64 opcodes debugging statement.
[deliverable/binutils-gdb.git] / gdb / expression.h
index ee3791f253b4a2031fd15f2ba06688a19f993faa..8fe6b070445492243f4162a591a5e453b3c198e8 100644 (file)
@@ -1,22 +1,29 @@
 /* Definitions for expressions stored in reversed prefix form, for GDB.
-   Copyright (C) 1986 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.
+   Copyright (C) 1986-2017 Free Software Foundation, Inc.
 
-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 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 3 of the License, or
+   (at your option) any later version.
+
+   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, see <http://www.gnu.org/licenses/>.  */
+
+#if !defined (EXPRESSION_H)
+#define EXPRESSION_H 1
+
+
+#include "symtab.h"            /* Needed for "struct block" type.  */
+#include "doublest.h"          /* Needed for DOUBLEST.  */
 
-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!
-*/
 
 /* Definitions for saved C expressions.  */
 
@@ -34,157 +41,130 @@ anyone else from sharing it farther.  Help stamp out software hoarding!
    by the preceding opcode.  */
 
 enum exp_opcode
-{
-/* BINOP_... operate on two values computed by following subexpressions,
-   replacing them by one result value.  They take no immediate arguments.  */
-  BINOP_ADD,           /* + */
-  BINOP_SUB,           /* - */
-  BINOP_MUL,           /* * */
-  BINOP_DIV,           /* / */
-  BINOP_REM,           /* % */
-  BINOP_LSH,           /* << */
-  BINOP_RSH,           /* >> */
-  BINOP_AND,           /* && */
-  BINOP_OR,            /* || */
-  BINOP_LOGAND,                /* & */
-  BINOP_LOGIOR,                /* | */
-  BINOP_LOGXOR,                /* ^ */
-  BINOP_EQUAL,         /* == */
-  BINOP_NOTEQUAL,      /* != */
-  BINOP_LESS,          /* < */
-  BINOP_GTR,           /* > */
-  BINOP_LEQ,           /* <= */
-  BINOP_GEQ,           /* >= */
-  BINOP_REPEAT,                /* @ */
-  BINOP_ASSIGN,                /* = */
-  BINOP_COMMA,         /* , */
-  BINOP_SUBSCRIPT,     /* x[y] */
-  BINOP_EXP,           /* Exponentiation */
-
-/* C++.  */
-  BINOP_SCOPE,         /* :: */
-
-  /* STRUCTOP_MEMBER is used for pointer-to-member constructs.
-     X . * Y translates into X STRUCTOP_MEMBER Y.  */
-  STRUCTOP_MEMBER,
-  /* STRUCTOP_MPTR is used for pointer-to-member constructs
-     when X is a pointer instead of an aggregate.  */
-  STRUCTOP_MPTR,
-/* end of C++.  */
-
-  BINOP_END,
-
-  BINOP_ASSIGN_MODIFY, /* +=, -=, *=, and so on.
-                          The following exp_element is another opcode,
-                          a BINOP_, saying how to modify.
-                          Then comes another BINOP_ASSIGN_MODIFY,
-                          making three exp_elements in total.  */
-
-/* Operates on three values computed by following subexpressions.  */
-  TERNOP_COND,         /* ?: */
-
-/* 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.  */
-
-/* OP_LONG is followed by a type pointer in the next exp_element
-   and the long constant value in the following exp_element.
-   Then comes another OP_LONG.
-   Thus, the operation occupies four exp_elements.  */
-
-  OP_LONG,
-/* OP_DOUBLE is similar but takes a double constant instead of a long one.  */
-  OP_DOUBLE,
-/* OP_VAR_VALUE takes one struct symbol * in the following exp_element,
-   followed by another OP_VAR_VALUE, making three exp_elements.  */
-  OP_VAR_VALUE,
-/* OP_LAST is followed by an integer in the next exp_element.
-   The integer is zero for the last value printed,
-   or it is the absolute number of a history element.
-   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,
-/* OP_INTERNALVAR is followed by an internalvar ptr in the next exp_element.
-   With another OP_INTERNALVAR at the end, this makes three exp_elements.  */
-  OP_INTERNALVAR,
-/* OP_FUNCALL is followed by an integer in the next exp_element.
-   The integer is the number of args to the function call.
-   That many plus one values from following subexpressions
-   are used, the first one being the function.
-   The integer is followed by a repeat of OP_FUNCALL,
-   making three exp_elements.  */
-  OP_FUNCALL,
-/* OP_STRING represents a string constant.
-   Its format is the same as that of a STRUCTOP, but the string
-   data is just made into a string constant when the operation
-   is executed.  */
-  OP_STRING,
-
-/* UNOP_CAST is followed by a type pointer in the next exp_element.
-   With another UNOP_CAST at the end, this makes three exp_elements.
-   It casts the value of the following subexpression.  */
-  UNOP_CAST,
-/* UNOP_MEMVAL is followed by a type pointer in the next exp_element
-   With another UNOP_MEMVAL at the end, this makes three exp_elements.
-   It casts the contents of the word addressed by the value of the
-   following subexpression.  */
-  UNOP_MEMVAL,
-/* 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_IND,            /* Unary * */
-  UNOP_ADDR,           /* Unary & */
-  UNOP_PREINCREMENT,   /* ++ before an expression */
-  UNOP_POSTINCREMENT,  /* ++ after an expression */
-  UNOP_PREDECREMENT,   /* -- before an expression */
-  UNOP_POSTDECREMENT,  /* -- after an expression */
-  UNOP_SIZEOF,         /* Unary sizeof (followed by expression) */
-
-/* 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).
-   STRUCTOP_STRUCT is used for "." and STRUCTOP_PTR for "->".
-   They differ only in the error message given in case the value is
-   not suitable or the structure component specified is not found.
-
-   The length of the string follows in the next exp_element,
-   (after the string), followed by another STRUCTOP_... code.  */
-  STRUCTOP_STRUCT,
-  STRUCTOP_PTR,
-
-/* C++ */
-  /* OP_THIS is just a placeholder for the class instance variable.
-     It just comes in a tight (OP_THIS, OP_THIS) pair.  */
-  OP_THIS,
-
-  /* OP_SCOPE surrounds a type name and a field name.  The type
-     name is encoded as one element, but the field name stays as
-     a string, which, of course, is variable length.  */
-  OP_SCOPE,
-
-};
+  {
+#define OP(name) name ,
+
+#include "std-operator.def"
+
+    /* First extension operator.  Individual language modules define extra
+       operators in *.def include files below with numbers higher than
+       OP_EXTENDED0.  */
+    OP (OP_EXTENDED0)
+
+/* Language specific operators.  */
+#include "ada-operator.def"
+
+#undef OP
+
+    /* Existing only to swallow the last comma (',') from last .inc file.  */
+    OP_UNUSED_LAST
+  };
 
 union exp_element
-{
-  enum exp_opcode opcode;
-  struct symbol *symbol;
-  long longconst;
-  double doubleconst;
-  char string;
-  struct type *type;
-  struct internalvar *internalvar;
-};
+  {
+    enum exp_opcode opcode;
+    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;
+    const struct block *block;
+    struct objfile *objfile;
+  };
 
 struct expression
-{
-  int nelts;
-  union exp_element elts[1];
-};
-
-struct expression *parse_c_expression ();
-struct expression *parse_c_1 ();
+  {
+    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];
+  };
+
+typedef gdb::unique_xmalloc_ptr<expression> expression_up;
+
+/* Macros for converting between number of expression elements and bytes
+   to store that many expression elements.  */
+
+#define EXP_ELEM_TO_BYTES(elements) \
+    ((elements) * sizeof (union exp_element))
+#define BYTES_TO_EXP_ELEM(bytes) \
+    (((bytes) + sizeof (union exp_element) - 1) / sizeof (union exp_element))
+
+/* From parse.c */
+
+extern expression_up parse_expression (const char *);
+
+extern expression_up parse_expression_with_language (const char *string,
+                                                    enum language lang);
+
+extern struct type *parse_expression_for_completion (const char *, char **,
+                                                    enum type_code *);
+
+extern expression_up parse_exp_1 (const char **, CORE_ADDR pc,
+                                 const struct block *, int);
+
+/* For use by parsers; set if we want to parse an expression and
+   attempt completion.  */
+extern int parse_completion;
+
+/* 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 const struct block *innermost_block;
+
+/* From eval.c */
+
+/* Values of NOSIDE argument to eval_subexp.  */
+
+enum noside
+  {
+    EVAL_NORMAL,
+    EVAL_SKIP,                 /* Only effect is to increment pos.  */
+    EVAL_AVOID_SIDE_EFFECTS    /* Don't modify any variables or
+                                  call any functions.  The value
+                                  returned will have the correct
+                                  type, and will have an
+                                  approximately correct lvalue
+                                  type (inaccuracy: anything that is
+                                  listed as being in a register in
+                                  the function in which it was
+                                  declared will be lval_register).
+                                  Ideally this would not even read
+                                  target memory, but currently it
+                                  does in many situations.  */
+  };
+
+extern struct value *evaluate_subexp_standard
+  (struct type *, struct expression *, int *, enum noside);
+
+/* From expprint.c */
+
+extern void print_expression (struct expression *, struct ui_file *);
+
+extern const char *op_name (struct expression *exp, enum exp_opcode opcode);
+
+extern const char *op_string (enum exp_opcode);
+
+extern void dump_raw_expression (struct expression *,
+                                struct ui_file *, const char *);
+extern void dump_prefix_expression (struct expression *, struct ui_file *);
+
+/* In an OP_RANGE expression, either bound could be empty, indicating
+   that its value is by default that of the corresponding bound of the
+   array or string.  So we have four sorts of subrange.  This
+   enumeration type is to identify this.  */
+   
+enum range_type
+  {
+    BOTH_BOUND_DEFAULT,                /* "(:)"  */
+    LOW_BOUND_DEFAULT,         /* "(:high)"  */
+    HIGH_BOUND_DEFAULT,                /* "(low:)"  */
+    NONE_BOUND_DEFAULT         /* "(low:high)"  */
+  };
+
+#endif /* !defined (EXPRESSION_H) */
This page took 0.050456 seconds and 4 git commands to generate.