/* Standard language operator definitions for GDB, the GNU debugger.

   Copyright (C) 1986-2026 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 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/>.  */

/* Used when it's necessary to pass an opcode which will be ignored,
   or to catch uninitialized values.  */
OP (OP_NULL)

/* BINOP_... operate on two values computed by following subexpressions,
replacing them by one result value.  They take no immediate arguments.  */

OP (BINOP_ADD)			/* + */
OP (BINOP_SUB)			/* - */
OP (BINOP_MUL)			/* * */
OP (BINOP_DIV)			/* / */
OP (BINOP_REM)			/* % */
OP (BINOP_MOD)			/* mod (Knuth 1.2.4) */
OP (BINOP_LSH)			/* << */
OP (BINOP_RSH)			/* >> */
OP (BINOP_LOGICAL_AND)		/* && */
OP (BINOP_LOGICAL_OR)		/* || */
OP (BINOP_BITWISE_AND)		/* & */
OP (BINOP_BITWISE_IOR)		/* | */
OP (BINOP_BITWISE_XOR)		/* ^ */
OP (BINOP_EQUAL)		/* == */
OP (BINOP_NOTEQUAL)		/* != */
OP (BINOP_LESS)			/* < */
OP (BINOP_GTR)			/* > */
OP (BINOP_LEQ)			/* <= */
OP (BINOP_GEQ)			/* >= */
OP (BINOP_REPEAT)		/* @ */
OP (BINOP_ASSIGN)		/* = */
OP (BINOP_COMMA)		/* , */
OP (BINOP_SUBSCRIPT)		/* x[y] */
OP (BINOP_EXP)			/* Exponentiation */

/* C++.  */

OP (BINOP_MIN)			/* <? */
OP (BINOP_MAX)			/* >? */

/* STRUCTOP_MEMBER is used for pointer-to-member constructs.
   X .  * Y translates into X STRUCTOP_MEMBER Y.  */
OP (STRUCTOP_MEMBER)

/* STRUCTOP_MPTR is used for pointer-to-member constructs
   when X is a pointer instead of an aggregate.  */
OP (STRUCTOP_MPTR)

/* TYPE_INSTANCE is used when the user specifies a specific
   type instantiation for overloaded methods/functions.

   The format is:
   TYPE_INSTANCE num_types type0 ... typeN num_types TYPE_INSTANCE.  */
OP (TYPE_INSTANCE)

/* end of C++.  */

/* For Modula-2 integer division DIV.  */
OP (BINOP_INTDIV)

/* +=, -=, *=, 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.  */
OP (BINOP_ASSIGN_MODIFY)

/* Modula-2 standard (binary) procedures.  */
OP (BINOP_VAL)

/* Concatenate two operands, such as character strings or bitstrings.
   If the first operand is a integer expression, then it means concatenate
   the second operand with itself that many times.  */
OP (BINOP_CONCAT)

/* Operates on three values computed by following subexpressions.  */
OP (TERNOP_COND)		/* ?: */

/* A sub-string/sub-array.  Ada syntax: OP1(OP2..OP3).  Return
   elements OP2 through OP3 of OP1.  */
OP (TERNOP_SLICE)

/* 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.  */
OP (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.  */

/* 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 (OP_LONG)

/* OP_FLOAT is similar but takes a floating-point constant encoded in
   the target format for the given type instead of a long.  */
OP (OP_FLOAT)

/* OP_VAR_VALUE takes one struct block * in the following element,
   and one struct symbol * in the following exp_element, followed
   by another OP_VAR_VALUE, making four exp_elements.  If the
   block is non-NULL, evaluate the symbol relative to the
   innermost frame executing in that block; if the block is NULL
   use the selected frame.  */
OP (OP_VAR_VALUE)

/* OP_VAR_ENTRY_VALUE takes one struct symbol * in the following element,
   followed by another OP_VAR_ENTRY_VALUE, making three exp_elements.
   somename@entry may mean parameter value as present at the entry of the
   current function.  Implemented via DW_OP_entry_value.  */
OP (OP_VAR_ENTRY_VALUE)

/* OP_VAR_MSYM_VALUE takes one struct objfile * in the following
   element, and one struct minimal_symbol * in the following
   exp_element, followed by another OP_VAR_MSYM_VALUE, making four
   exp_elements.  */
OP (OP_VAR_MSYM_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 (OP_LAST)

/* OP_REGISTER is followed by a string in the next exp_element.
   This is the name of a register to fetch.  */
OP (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 (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 (OP_FUNCALL)

/* OP_OBJC_MSGCALL is followed by a string in the next exp_element
   and then an integer.  The string is the selector string.  The
   integer is the number of arguments to the message call.  That
   many plus one values are used, the first one being the object
   pointer.  This is an Objective C message.  */
OP (OP_OBJC_MSGCALL)

/* 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 (OP_COMPLEX)

/* 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 (OP_STRING)

/* OP_ARRAY creates an array constant out of the following subexpressions.
   It is followed by two exp_elements, the first containing an integer
   that is the lower bound of the array and the second containing another
   integer that is the upper bound of the array.  The second integer is
   followed by a repeat of OP_ARRAY, making four exp_elements total.
   The bounds are used to compute the number of following subexpressions
   to consume, as well as setting the bounds in the created array constant.
   The type of the elements is taken from the type of the first subexp,
   and they must all match.  */
OP (OP_ARRAY)

/* UNOP_EXTRACT takes a value and a type, like a cast, but, instead of
   casting the value to the given type, a new value (of the given
   type) is extracted from the contents of the old value, starting
   from the least significant byte.

   It is invalid for the given type to be larger than the type of the
   given value.  */
OP (UNOP_EXTRACT)

/* 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.  */
OP (UNOP_CAST)

/* Like UNOP_CAST, but the type is a subexpression.  */
OP (UNOP_CAST_TYPE)

/* The C++ dynamic_cast operator.  */
OP (UNOP_DYNAMIC_CAST)

/* The C++ reinterpret_cast operator.  */
OP (UNOP_REINTERPRET_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.  */
OP (UNOP_MEMVAL)

/* Like UNOP_MEMVAL, but the type is supplied as a subexpression.  */
OP (UNOP_MEMVAL_TYPE)

/* UNOP_... operate on one value from a following subexpression
   and replace it with a result.  They take no immediate arguments.  */

OP (UNOP_NEG)			/* Unary - */
OP (UNOP_LOGICAL_NOT)		/* Unary ! */
OP (UNOP_COMPLEMENT)		/* Unary ~ */
OP (UNOP_IND)			/* Unary * */
OP (UNOP_ADDR)			/* Unary & */
OP (UNOP_PREINCREMENT)		/* ++ before an expression */
OP (UNOP_POSTINCREMENT)		/* ++ after an expression */
OP (UNOP_PREDECREMENT)		/* -- before an expression */
OP (UNOP_POSTDECREMENT)		/* -- after an expression */
OP (UNOP_SIZEOF)		/* Unary sizeof (followed by expression) */
OP (UNOP_ALIGNOF)		/* Unary alignof (followed by expression) */

OP (UNOP_PLUS)			/* Unary plus */

OP (UNOP_ABS)
OP (UNOP_HIGH)

OP (OP_BOOL)			/* Modula-2 builtin BOOLEAN type */

/* 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 the opcode, followed by
   BYTES_TO_EXP_ELEM(length) elements containing the data of the
   string, followed by the length again and the opcode again.  */

OP (STRUCTOP_STRUCT)
OP (STRUCTOP_PTR)

/* Anonymous field access, e.g. "foo.3".  Used in Rust.  */
OP (STRUCTOP_ANONYMOUS)

/* C++: OP_THIS is just a placeholder for the class instance variable.
   It just comes in a tight (OP_THIS, OP_THIS) pair.  */
OP (OP_THIS)

/* Objective C: "@selector" pseudo-operator.  */
OP (OP_OBJC_SELECTOR)

/* 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 (OP_SCOPE)

/* OP_FUNC_STATIC_VAR refers to a function local static variable.  The
   function is taken from the following subexpression.  The length of
   the variable name as a string follows the opcode, followed by
   BYTES_TO_EXP_ELEM(length) elements containing the data of the
   string, followed by the length again and the opcode again.

   Note this is used by C++, but not C.  The C parser handles local
   static variables in the parser directly.  Also, this is only used
   in C++ if the function/method name is not quoted, like e.g.:

     p S:method()::var
     p S:method() const::var

   If the function/method is quoted like instead:

     p 'S:method() const'::var

   then the C-specific handling directly in the parser takes over (see
   block/variable productions).

   Also, if the whole function+var is quoted like this:

     p 'S:method() const::var'

   then the whole quoted expression is interpreted as a single symbol
   name and we don't use OP_FUNC_STATIC_VAR either.  In that case, the
   C++-specific symbol lookup routines take care of the
   function-local-static search.  */
OP (OP_FUNC_STATIC_VAR)

/* 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 (OP_TYPE)

/* An Objective C Foundation Class NSString constant.  */
OP (OP_OBJC_NSSTRING)

/* An array range operator (in Fortran 90, for "exp:exp", "exp:",
   ":exp" and ":").  */
OP (OP_RANGE)

/* OP_ADL_FUNC specifies that the function is to be looked up in an
   Argument Dependent manner (Koenig lookup).  */
OP (OP_ADL_FUNC)

/* The typeof operator.  This has one expression argument, which is
   evaluated solely for its type.  */
OP (OP_TYPEOF)

/* The decltype operator.  This has one expression argument, which is
   evaluated solely for its type.  This is similar to typeof, but has
   slight different semantics.  */
OP (OP_DECLTYPE)

/* The typeid operator.  This has one expression argument.  */
OP (OP_TYPEID)

/* This is used for the Rust [expr; N] form of array construction.  It
   takes two expression arguments.  */
OP (OP_RUST_ARRAY)

/* ================ Ada operators ================ */

/* X IN A'RANGE(N).  N is an immediate operand, surrounded by
   BINOP_IN_BOUNDS before and after.  A is an array, X an index
   value.  Evaluates to true iff X is within range of the Nth
   dimension (1-based) of A.  (A multi-dimensional array
   type is represented as array of array of ...) */
OP (BINOP_IN_BOUNDS)

/* X IN L .. U.  True iff L <= X <= U.  */
OP (TERNOP_IN_RANGE)

/* Ada attributes ('Foo). */
OP (OP_ATR_FIRST)
OP (OP_ATR_LAST)
OP (OP_ATR_LENGTH)
OP (OP_ATR_POS)
OP (OP_ATR_SIZE)
OP (OP_ATR_TAG)
OP (OP_ATR_VAL)

/* Ada type qualification.  It is encoded as for UNOP_CAST, above,
   and denotes the TYPE'(EXPR) construct. */
OP (UNOP_QUAL)

/* X IN TYPE.  The `TYPE' argument is immediate, with
   UNOP_IN_RANGE before and after it. True iff X is a member of
   type TYPE (typically a subrange). */
OP (UNOP_IN_RANGE)

/* An aggregate.   A single immediate operand, N>0, gives
   the number of component specifications that follow.  The
   immediate operand is followed by a second OP_AGGREGATE.
   Next come N component specifications.  A component
   specification is either an OP_OTHERS (others=>...), an
   OP_CHOICES (for named associations), or other expression (for
   positional aggregates only).  Aggregates currently
   occur only as the right sides of assignments. */
OP (OP_AGGREGATE)

/* ================ Fortran operators ================ */

/* 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 disambiguated at runtime.  Thus this operator,
   which indicates that we have found something of the form
   <name> ( <stuff> ).  */
OP (OP_F77_UNDETERMINED_ARGLIST)

/* Single operand builtins.  */
OP (UNOP_FORTRAN_KIND)
OP (UNOP_FORTRAN_ALLOCATED)
OP (UNOP_FORTRAN_RANK)
OP (UNOP_FORTRAN_SHAPE)
OP (UNOP_FORTRAN_LOC)

/* Two operand builtins.  */
OP (BINOP_FORTRAN_MODULO)

/* Builtins that take one or two operands.  */
OP (FORTRAN_CEILING)
OP (FORTRAN_FLOOR)
OP (FORTRAN_ASSOCIATED)

/* Builtins that take one, two or three operands.  */
OP (FORTRAN_LBOUND)
OP (FORTRAN_UBOUND)
OP (FORTRAN_CMPLX)
OP (FORTRAN_ARRAY_SIZE)
