Home | History | Annotate | Line # | Download | only in gdb
ada-exp.h revision 1.1.1.1
      1  1.1  christos /* Definitions for Ada expressions
      2  1.1  christos 
      3  1.1  christos    Copyright (C) 2020-2023 Free Software Foundation, Inc.
      4  1.1  christos 
      5  1.1  christos    This file is part of GDB.
      6  1.1  christos 
      7  1.1  christos    This program is free software; you can redistribute it and/or modify
      8  1.1  christos    it under the terms of the GNU General Public License as published by
      9  1.1  christos    the Free Software Foundation; either version 3 of the License, or
     10  1.1  christos    (at your option) any later version.
     11  1.1  christos 
     12  1.1  christos    This program is distributed in the hope that it will be useful,
     13  1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15  1.1  christos    GNU General Public License for more details.
     16  1.1  christos 
     17  1.1  christos    You should have received a copy of the GNU General Public License
     18  1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19  1.1  christos 
     20  1.1  christos #ifndef ADA_EXP_H
     21  1.1  christos #define ADA_EXP_H
     22  1.1  christos 
     23  1.1  christos #include "expop.h"
     24  1.1  christos 
     25  1.1  christos extern struct value *ada_unop_neg (struct type *expect_type,
     26  1.1  christos 				   struct expression *exp,
     27  1.1  christos 				   enum noside noside, enum exp_opcode op,
     28  1.1  christos 				   struct value *arg1);
     29  1.1  christos extern struct value *ada_atr_tag (struct type *expect_type,
     30  1.1  christos 				  struct expression *exp,
     31  1.1  christos 				  enum noside noside, enum exp_opcode op,
     32  1.1  christos 				  struct value *arg1);
     33  1.1  christos extern struct value *ada_atr_size (struct type *expect_type,
     34  1.1  christos 				   struct expression *exp,
     35  1.1  christos 				   enum noside noside, enum exp_opcode op,
     36  1.1  christos 				   struct value *arg1);
     37  1.1  christos extern struct value *ada_abs (struct type *expect_type,
     38  1.1  christos 			      struct expression *exp,
     39  1.1  christos 			      enum noside noside, enum exp_opcode op,
     40  1.1  christos 			      struct value *arg1);
     41  1.1  christos extern struct value *ada_unop_in_range (struct type *expect_type,
     42  1.1  christos 					struct expression *exp,
     43  1.1  christos 					enum noside noside, enum exp_opcode op,
     44  1.1  christos 					struct value *arg1, struct type *type);
     45  1.1  christos extern struct value *ada_mult_binop (struct type *expect_type,
     46  1.1  christos 				     struct expression *exp,
     47  1.1  christos 				     enum noside noside, enum exp_opcode op,
     48  1.1  christos 				     struct value *arg1, struct value *arg2);
     49  1.1  christos extern struct value *ada_equal_binop (struct type *expect_type,
     50  1.1  christos 				      struct expression *exp,
     51  1.1  christos 				      enum noside noside, enum exp_opcode op,
     52  1.1  christos 				      struct value *arg1, struct value *arg2);
     53  1.1  christos extern struct value *ada_ternop_slice (struct expression *exp,
     54  1.1  christos 				       enum noside noside,
     55  1.1  christos 				       struct value *array,
     56  1.1  christos 				       struct value *low_bound_val,
     57  1.1  christos 				       struct value *high_bound_val);
     58  1.1  christos extern struct value *ada_binop_in_bounds (struct expression *exp,
     59  1.1  christos 					  enum noside noside,
     60  1.1  christos 					  struct value *arg1,
     61  1.1  christos 					  struct value *arg2,
     62  1.1  christos 					  int n);
     63  1.1  christos extern struct value *ada_binop_minmax (struct type *expect_type,
     64  1.1  christos 				       struct expression *exp,
     65  1.1  christos 				       enum noside noside, enum exp_opcode op,
     66  1.1  christos 				       struct value *arg1,
     67  1.1  christos 				       struct value *arg2);
     68  1.1  christos extern struct value *ada_pos_atr (struct type *expect_type,
     69  1.1  christos 				  struct expression *exp,
     70  1.1  christos 				  enum noside noside, enum exp_opcode op,
     71  1.1  christos 				  struct value *arg);
     72  1.1  christos extern struct value *ada_val_atr (enum noside noside, struct type *type,
     73  1.1  christos 				  struct value *arg);
     74  1.1  christos extern struct value *ada_binop_exp (struct type *expect_type,
     75  1.1  christos 				    struct expression *exp,
     76  1.1  christos 				    enum noside noside, enum exp_opcode op,
     77  1.1  christos 				    struct value *arg1, struct value *arg2);
     78  1.1  christos 
     79  1.1  christos namespace expr
     80  1.1  christos {
     81  1.1  christos 
     82  1.1  christos /* The base class for Ada type resolution.  Ada operations that want
     83  1.1  christos    to participate in resolution implement this interface.  */
     84  1.1  christos struct ada_resolvable
     85  1.1  christos {
     86  1.1  christos   /* Resolve this object.  EXP is the expression being resolved.
     87  1.1  christos      DEPROCEDURE_P is true if a symbol that refers to a zero-argument
     88  1.1  christos      function may be turned into a function call.  PARSE_COMPLETION
     89  1.1  christos      and TRACKER are passed in from the parser context.  CONTEXT_TYPE
     90  1.1  christos      is the expected type of the expression, or nullptr if none is
     91  1.1  christos      known.  This method should return true if the operation should be
     92  1.1  christos      replaced by a function call with this object as the callee.  */
     93  1.1  christos   virtual bool resolve (struct expression *exp,
     94  1.1  christos 			bool deprocedure_p,
     95  1.1  christos 			bool parse_completion,
     96  1.1  christos 			innermost_block_tracker *tracker,
     97  1.1  christos 			struct type *context_type) = 0;
     98  1.1  christos 
     99  1.1  christos   /* Possibly replace this object with some other expression object.
    100  1.1  christos      This is like 'resolve', but can return a replacement.
    101  1.1  christos 
    102  1.1  christos      The default implementation calls 'resolve' and wraps this object
    103  1.1  christos      in a function call if that call returns true.  OWNER is a
    104  1.1  christos      reference to the unique pointer that owns the 'this'; it can be
    105  1.1  christos      'move'd from to construct the replacement.
    106  1.1  christos 
    107  1.1  christos      This should either return a new object, or OWNER -- never
    108  1.1  christos      nullptr.  */
    109  1.1  christos 
    110  1.1  christos   virtual operation_up replace (operation_up &&owner,
    111  1.1  christos 				struct expression *exp,
    112  1.1  christos 				bool deprocedure_p,
    113  1.1  christos 				bool parse_completion,
    114  1.1  christos 				innermost_block_tracker *tracker,
    115  1.1  christos 				struct type *context_type);
    116  1.1  christos };
    117  1.1  christos 
    118  1.1  christos /* In Ada, some generic operations must be wrapped with a handler that
    119  1.1  christos    handles some Ada-specific type conversions.  */
    120  1.1  christos class ada_wrapped_operation
    121  1.1  christos   : public tuple_holding_operation<operation_up>
    122  1.1  christos {
    123  1.1  christos public:
    124  1.1  christos 
    125  1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    126  1.1  christos 
    127  1.1  christos   value *evaluate (struct type *expect_type,
    128  1.1  christos 		   struct expression *exp,
    129  1.1  christos 		   enum noside noside) override;
    130  1.1  christos 
    131  1.1  christos   enum exp_opcode opcode () const override
    132  1.1  christos   { return std::get<0> (m_storage)->opcode (); }
    133  1.1  christos };
    134  1.1  christos 
    135  1.1  christos /* An Ada string constant.  */
    136  1.1  christos class ada_string_operation
    137  1.1  christos   : public string_operation
    138  1.1  christos {
    139  1.1  christos public:
    140  1.1  christos 
    141  1.1  christos   using string_operation::string_operation;
    142  1.1  christos 
    143  1.1  christos   /* Return the underlying string.  */
    144  1.1  christos   const char *get_name () const
    145  1.1  christos   {
    146  1.1  christos     return std::get<0> (m_storage).c_str ();
    147  1.1  christos   }
    148  1.1  christos 
    149  1.1  christos   value *evaluate (struct type *expect_type,
    150  1.1  christos 		   struct expression *exp,
    151  1.1  christos 		   enum noside noside) override;
    152  1.1  christos };
    153  1.1  christos 
    154  1.1  christos /* The Ada TYPE'(EXP) construct.  */
    155  1.1  christos class ada_qual_operation
    156  1.1  christos   : public tuple_holding_operation<operation_up, struct type *>
    157  1.1  christos {
    158  1.1  christos public:
    159  1.1  christos 
    160  1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    161  1.1  christos 
    162  1.1  christos   value *evaluate (struct type *expect_type,
    163  1.1  christos 		   struct expression *exp,
    164  1.1  christos 		   enum noside noside) override;
    165  1.1  christos 
    166  1.1  christos   enum exp_opcode opcode () const override
    167  1.1  christos   { return UNOP_QUAL; }
    168  1.1  christos };
    169  1.1  christos 
    170  1.1  christos /* Ternary in-range operator.  */
    171  1.1  christos class ada_ternop_range_operation
    172  1.1  christos   : public tuple_holding_operation<operation_up, operation_up, operation_up>
    173  1.1  christos {
    174  1.1  christos public:
    175  1.1  christos 
    176  1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    177  1.1  christos 
    178  1.1  christos   value *evaluate (struct type *expect_type,
    179  1.1  christos 		   struct expression *exp,
    180  1.1  christos 		   enum noside noside) override;
    181  1.1  christos 
    182  1.1  christos   enum exp_opcode opcode () const override
    183  1.1  christos   { return TERNOP_IN_RANGE; }
    184  1.1  christos };
    185  1.1  christos 
    186  1.1  christos using ada_neg_operation = unop_operation<UNOP_NEG, ada_unop_neg>;
    187  1.1  christos using ada_atr_tag_operation = unop_operation<OP_ATR_TAG, ada_atr_tag>;
    188  1.1  christos using ada_atr_size_operation = unop_operation<OP_ATR_SIZE, ada_atr_size>;
    189  1.1  christos using ada_abs_operation = unop_operation<UNOP_ABS, ada_abs>;
    190  1.1  christos using ada_pos_operation = unop_operation<OP_ATR_POS, ada_pos_atr>;
    191  1.1  christos 
    192  1.1  christos /* The in-range operation, given a type.  */
    193  1.1  christos class ada_unop_range_operation
    194  1.1  christos   : public tuple_holding_operation<operation_up, struct type *>
    195  1.1  christos {
    196  1.1  christos public:
    197  1.1  christos 
    198  1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    199  1.1  christos 
    200  1.1  christos   value *evaluate (struct type *expect_type,
    201  1.1  christos 		   struct expression *exp,
    202  1.1  christos 		   enum noside noside) override
    203  1.1  christos   {
    204  1.1  christos     value *val = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
    205  1.1  christos     return ada_unop_in_range (expect_type, exp, noside, UNOP_IN_RANGE,
    206  1.1  christos 			      val, std::get<1> (m_storage));
    207  1.1  christos   }
    208  1.1  christos 
    209  1.1  christos   enum exp_opcode opcode () const override
    210  1.1  christos   { return UNOP_IN_RANGE; }
    211  1.1  christos };
    212  1.1  christos 
    213  1.1  christos /* The Ada + and - operators.  */
    214  1.1  christos class ada_binop_addsub_operation
    215  1.1  christos   : public tuple_holding_operation<enum exp_opcode, operation_up, operation_up>
    216  1.1  christos {
    217  1.1  christos public:
    218  1.1  christos 
    219  1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    220  1.1  christos 
    221  1.1  christos   value *evaluate (struct type *expect_type,
    222  1.1  christos 		   struct expression *exp,
    223  1.1  christos 		   enum noside noside) override;
    224  1.1  christos 
    225  1.1  christos   enum exp_opcode opcode () const override
    226  1.1  christos   { return std::get<0> (m_storage); }
    227  1.1  christos };
    228  1.1  christos 
    229  1.1  christos using ada_binop_mul_operation = binop_operation<BINOP_MUL, ada_mult_binop>;
    230  1.1  christos using ada_binop_div_operation = binop_operation<BINOP_DIV, ada_mult_binop>;
    231  1.1  christos using ada_binop_rem_operation = binop_operation<BINOP_REM, ada_mult_binop>;
    232  1.1  christos using ada_binop_mod_operation = binop_operation<BINOP_MOD, ada_mult_binop>;
    233  1.1  christos 
    234  1.1  christos using ada_binop_min_operation = binop_operation<BINOP_MIN, ada_binop_minmax>;
    235  1.1  christos using ada_binop_max_operation = binop_operation<BINOP_MAX, ada_binop_minmax>;
    236  1.1  christos 
    237  1.1  christos using ada_binop_exp_operation = binop_operation<BINOP_EXP, ada_binop_exp>;
    238  1.1  christos 
    239  1.1  christos /* Implement the equal and not-equal operations for Ada.  */
    240  1.1  christos class ada_binop_equal_operation
    241  1.1  christos   : public tuple_holding_operation<enum exp_opcode, operation_up, operation_up>
    242  1.1  christos {
    243  1.1  christos public:
    244  1.1  christos 
    245  1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    246  1.1  christos 
    247  1.1  christos   value *evaluate (struct type *expect_type,
    248  1.1  christos 		   struct expression *exp,
    249  1.1  christos 		   enum noside noside) override
    250  1.1  christos   {
    251  1.1  christos     value *arg1 = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
    252  1.1  christos     value *arg2 = std::get<2> (m_storage)->evaluate (value_type (arg1),
    253  1.1  christos 						     exp, noside);
    254  1.1  christos     return ada_equal_binop (expect_type, exp, noside, std::get<0> (m_storage),
    255  1.1  christos 			    arg1, arg2);
    256  1.1  christos   }
    257  1.1  christos 
    258  1.1  christos   enum exp_opcode opcode () const override
    259  1.1  christos   { return std::get<0> (m_storage); }
    260  1.1  christos };
    261  1.1  christos 
    262  1.1  christos /* Bitwise operators for Ada.  */
    263  1.1  christos template<enum exp_opcode OP>
    264  1.1  christos class ada_bitwise_operation
    265  1.1  christos   : public maybe_constant_operation<operation_up, operation_up>
    266  1.1  christos {
    267  1.1  christos public:
    268  1.1  christos 
    269  1.1  christos   using maybe_constant_operation::maybe_constant_operation;
    270  1.1  christos 
    271  1.1  christos   value *evaluate (struct type *expect_type,
    272  1.1  christos 		   struct expression *exp,
    273  1.1  christos 		   enum noside noside) override
    274  1.1  christos   {
    275  1.1  christos     value *lhs = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
    276  1.1  christos     value *rhs = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
    277  1.1  christos     value *result = eval_op_binary (expect_type, exp, noside, OP, lhs, rhs);
    278  1.1  christos     return value_cast (value_type (lhs), result);
    279  1.1  christos   }
    280  1.1  christos 
    281  1.1  christos   enum exp_opcode opcode () const override
    282  1.1  christos   { return OP; }
    283  1.1  christos };
    284  1.1  christos 
    285  1.1  christos using ada_bitwise_and_operation = ada_bitwise_operation<BINOP_BITWISE_AND>;
    286  1.1  christos using ada_bitwise_ior_operation = ada_bitwise_operation<BINOP_BITWISE_IOR>;
    287  1.1  christos using ada_bitwise_xor_operation = ada_bitwise_operation<BINOP_BITWISE_XOR>;
    288  1.1  christos 
    289  1.1  christos /* Ada array- or string-slice operation.  */
    290  1.1  christos class ada_ternop_slice_operation
    291  1.1  christos   : public maybe_constant_operation<operation_up, operation_up, operation_up>,
    292  1.1  christos     public ada_resolvable
    293  1.1  christos {
    294  1.1  christos public:
    295  1.1  christos 
    296  1.1  christos   using maybe_constant_operation::maybe_constant_operation;
    297  1.1  christos 
    298  1.1  christos   value *evaluate (struct type *expect_type,
    299  1.1  christos 		   struct expression *exp,
    300  1.1  christos 		   enum noside noside) override
    301  1.1  christos   {
    302  1.1  christos     value *array = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
    303  1.1  christos     value *low = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
    304  1.1  christos     value *high = std::get<2> (m_storage)->evaluate (nullptr, exp, noside);
    305  1.1  christos     return ada_ternop_slice (exp, noside, array, low, high);
    306  1.1  christos   }
    307  1.1  christos 
    308  1.1  christos   enum exp_opcode opcode () const override
    309  1.1  christos   { return TERNOP_SLICE; }
    310  1.1  christos 
    311  1.1  christos   bool resolve (struct expression *exp,
    312  1.1  christos 		bool deprocedure_p,
    313  1.1  christos 		bool parse_completion,
    314  1.1  christos 		innermost_block_tracker *tracker,
    315  1.1  christos 		struct type *context_type) override;
    316  1.1  christos };
    317  1.1  christos 
    318  1.1  christos /* Implement BINOP_IN_BOUNDS for Ada.  */
    319  1.1  christos class ada_binop_in_bounds_operation
    320  1.1  christos   : public maybe_constant_operation<operation_up, operation_up, int>
    321  1.1  christos {
    322  1.1  christos public:
    323  1.1  christos 
    324  1.1  christos   using maybe_constant_operation::maybe_constant_operation;
    325  1.1  christos 
    326  1.1  christos   value *evaluate (struct type *expect_type,
    327  1.1  christos 		   struct expression *exp,
    328  1.1  christos 		   enum noside noside) override
    329  1.1  christos   {
    330  1.1  christos     value *arg1 = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
    331  1.1  christos     value *arg2 = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
    332  1.1  christos     return ada_binop_in_bounds (exp, noside, arg1, arg2,
    333  1.1  christos 				std::get<2> (m_storage));
    334  1.1  christos   }
    335  1.1  christos 
    336  1.1  christos   enum exp_opcode opcode () const override
    337  1.1  christos   { return BINOP_IN_BOUNDS; }
    338  1.1  christos };
    339  1.1  christos 
    340  1.1  christos /* Implement several unary Ada OP_ATR_* operations.  */
    341  1.1  christos class ada_unop_atr_operation
    342  1.1  christos   : public maybe_constant_operation<operation_up, enum exp_opcode, int>
    343  1.1  christos {
    344  1.1  christos public:
    345  1.1  christos 
    346  1.1  christos   using maybe_constant_operation::maybe_constant_operation;
    347  1.1  christos 
    348  1.1  christos   value *evaluate (struct type *expect_type,
    349  1.1  christos 		   struct expression *exp,
    350  1.1  christos 		   enum noside noside) override;
    351  1.1  christos 
    352  1.1  christos   enum exp_opcode opcode () const override
    353  1.1  christos   { return std::get<1> (m_storage); }
    354  1.1  christos };
    355  1.1  christos 
    356  1.1  christos /* Variant of var_value_operation for Ada.  */
    357  1.1  christos class ada_var_value_operation
    358  1.1  christos   : public var_value_operation, public ada_resolvable
    359  1.1  christos {
    360  1.1  christos public:
    361  1.1  christos 
    362  1.1  christos   using var_value_operation::var_value_operation;
    363  1.1  christos 
    364  1.1  christos   value *evaluate (struct type *expect_type,
    365  1.1  christos 		   struct expression *exp,
    366  1.1  christos 		   enum noside noside) override;
    367  1.1  christos 
    368  1.1  christos   value *evaluate_for_cast (struct type *expect_type,
    369  1.1  christos 			    struct expression *exp,
    370  1.1  christos 			    enum noside noside) override;
    371  1.1  christos 
    372  1.1  christos   const block *get_block () const
    373  1.1  christos   { return std::get<0> (m_storage).block; }
    374  1.1  christos 
    375  1.1  christos   bool resolve (struct expression *exp,
    376  1.1  christos 		bool deprocedure_p,
    377  1.1  christos 		bool parse_completion,
    378  1.1  christos 		innermost_block_tracker *tracker,
    379  1.1  christos 		struct type *context_type) override;
    380  1.1  christos 
    381  1.1  christos protected:
    382  1.1  christos 
    383  1.1  christos   using operation::do_generate_ax;
    384  1.1  christos };
    385  1.1  christos 
    386  1.1  christos /* Variant of var_msym_value_operation for Ada.  */
    387  1.1  christos class ada_var_msym_value_operation
    388  1.1  christos   : public var_msym_value_operation
    389  1.1  christos {
    390  1.1  christos public:
    391  1.1  christos 
    392  1.1  christos   using var_msym_value_operation::var_msym_value_operation;
    393  1.1  christos 
    394  1.1  christos   value *evaluate_for_cast (struct type *expect_type,
    395  1.1  christos 			    struct expression *exp,
    396  1.1  christos 			    enum noside noside) override;
    397  1.1  christos 
    398  1.1  christos protected:
    399  1.1  christos 
    400  1.1  christos   using operation::do_generate_ax;
    401  1.1  christos };
    402  1.1  christos 
    403  1.1  christos /* Implement the Ada 'val attribute.  */
    404  1.1  christos class ada_atr_val_operation
    405  1.1  christos   : public tuple_holding_operation<struct type *, operation_up>
    406  1.1  christos {
    407  1.1  christos public:
    408  1.1  christos 
    409  1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    410  1.1  christos 
    411  1.1  christos   value *evaluate (struct type *expect_type,
    412  1.1  christos 		   struct expression *exp,
    413  1.1  christos 		   enum noside noside) override;
    414  1.1  christos 
    415  1.1  christos   enum exp_opcode opcode () const override
    416  1.1  christos   { return OP_ATR_VAL; }
    417  1.1  christos };
    418  1.1  christos 
    419  1.1  christos /* The indirection operator for Ada.  */
    420  1.1  christos class ada_unop_ind_operation
    421  1.1  christos   : public unop_ind_base_operation
    422  1.1  christos {
    423  1.1  christos public:
    424  1.1  christos 
    425  1.1  christos   using unop_ind_base_operation::unop_ind_base_operation;
    426  1.1  christos 
    427  1.1  christos   value *evaluate (struct type *expect_type,
    428  1.1  christos 		   struct expression *exp,
    429  1.1  christos 		   enum noside noside) override;
    430  1.1  christos };
    431  1.1  christos 
    432  1.1  christos /* Implement STRUCTOP_STRUCT for Ada.  */
    433  1.1  christos class ada_structop_operation
    434  1.1  christos   : public structop_base_operation
    435  1.1  christos {
    436  1.1  christos public:
    437  1.1  christos 
    438  1.1  christos   using structop_base_operation::structop_base_operation;
    439  1.1  christos 
    440  1.1  christos   value *evaluate (struct type *expect_type,
    441  1.1  christos 		   struct expression *exp,
    442  1.1  christos 		   enum noside noside) override;
    443  1.1  christos 
    444  1.1  christos   enum exp_opcode opcode () const override
    445  1.1  christos   { return STRUCTOP_STRUCT; }
    446  1.1  christos 
    447  1.1  christos   /* Set the completion prefix.  */
    448  1.1  christos   void set_prefix (std::string &&prefix)
    449  1.1  christos   {
    450  1.1  christos     m_prefix = std::move (prefix);
    451  1.1  christos   }
    452  1.1  christos 
    453  1.1  christos   bool complete (struct expression *exp, completion_tracker &tracker) override
    454  1.1  christos   {
    455  1.1  christos     return structop_base_operation::complete (exp, tracker, m_prefix.c_str ());
    456  1.1  christos   }
    457  1.1  christos 
    458  1.1  christos   void dump (struct ui_file *stream, int depth) const override
    459  1.1  christos   {
    460  1.1  christos     structop_base_operation::dump (stream, depth);
    461  1.1  christos     dump_for_expression (stream, depth + 1, m_prefix);
    462  1.1  christos   }
    463  1.1  christos 
    464  1.1  christos private:
    465  1.1  christos 
    466  1.1  christos   /* We may need to provide a prefix to field name completion.  See
    467  1.1  christos      ada-exp.y:find_completion_bounds for details.  */
    468  1.1  christos   std::string m_prefix;
    469  1.1  christos };
    470  1.1  christos 
    471  1.1  christos /* Function calls for Ada.  */
    472  1.1  christos class ada_funcall_operation
    473  1.1  christos   : public tuple_holding_operation<operation_up, std::vector<operation_up>>,
    474  1.1  christos     public ada_resolvable
    475  1.1  christos {
    476  1.1  christos public:
    477  1.1  christos 
    478  1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    479  1.1  christos 
    480  1.1  christos   value *evaluate (struct type *expect_type,
    481  1.1  christos 		   struct expression *exp,
    482  1.1  christos 		   enum noside noside) override;
    483  1.1  christos 
    484  1.1  christos   bool resolve (struct expression *exp,
    485  1.1  christos 		bool deprocedure_p,
    486  1.1  christos 		bool parse_completion,
    487  1.1  christos 		innermost_block_tracker *tracker,
    488  1.1  christos 		struct type *context_type) override;
    489  1.1  christos 
    490  1.1  christos   enum exp_opcode opcode () const override
    491  1.1  christos   { return OP_FUNCALL; }
    492  1.1  christos };
    493  1.1  christos 
    494  1.1  christos /* An Ada assignment operation.  */
    495  1.1  christos class ada_assign_operation
    496  1.1  christos   : public assign_operation
    497  1.1  christos {
    498  1.1  christos public:
    499  1.1  christos 
    500  1.1  christos   using assign_operation::assign_operation;
    501  1.1  christos 
    502  1.1  christos   value *evaluate (struct type *expect_type,
    503  1.1  christos 		   struct expression *exp,
    504  1.1  christos 		   enum noside noside) override;
    505  1.1  christos 
    506  1.1  christos   enum exp_opcode opcode () const override
    507  1.1  christos   { return BINOP_ASSIGN; }
    508  1.1  christos };
    509  1.1  christos 
    510  1.1  christos /* This abstract class represents a single component in an Ada
    511  1.1  christos    aggregate assignment.  */
    512  1.1  christos class ada_component
    513  1.1  christos {
    514  1.1  christos public:
    515  1.1  christos 
    516  1.1  christos   /* Assign to LHS, which is part of CONTAINER.  EXP is the expression
    517  1.1  christos      being evaluated.  INDICES, LOW, and HIGH indicate which
    518  1.1  christos      sub-components have already been assigned; INDICES should be
    519  1.1  christos      updated by this call.  */
    520  1.1  christos   virtual void assign (struct value *container,
    521  1.1  christos 		       struct value *lhs, struct expression *exp,
    522  1.1  christos 		       std::vector<LONGEST> &indices,
    523  1.1  christos 		       LONGEST low, LONGEST high) = 0;
    524  1.1  christos 
    525  1.1  christos   /* Same as operation::uses_objfile.  */
    526  1.1  christos   virtual bool uses_objfile (struct objfile *objfile) = 0;
    527  1.1  christos 
    528  1.1  christos   /* Same as operation::dump.  */
    529  1.1  christos   virtual void dump (ui_file *stream, int depth) = 0;
    530  1.1  christos 
    531  1.1  christos   virtual ~ada_component () = default;
    532  1.1  christos 
    533  1.1  christos protected:
    534  1.1  christos 
    535  1.1  christos   ada_component () = default;
    536  1.1  christos   DISABLE_COPY_AND_ASSIGN (ada_component);
    537  1.1  christos };
    538  1.1  christos 
    539  1.1  christos /* Unique pointer specialization for Ada assignment components.  */
    540  1.1  christos typedef std::unique_ptr<ada_component> ada_component_up;
    541  1.1  christos 
    542  1.1  christos /* An operation that holds a single component.  */
    543  1.1  christos class ada_aggregate_operation
    544  1.1  christos   : public tuple_holding_operation<ada_component_up>
    545  1.1  christos {
    546  1.1  christos public:
    547  1.1  christos 
    548  1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    549  1.1  christos 
    550  1.1  christos   /* Assuming that LHS represents an lvalue having a record or array
    551  1.1  christos      type, evaluate an assignment of this aggregate's value to LHS.
    552  1.1  christos      CONTAINER is an lvalue containing LHS (possibly LHS itself).
    553  1.1  christos      Does not modify the inferior's memory, nor does it modify the
    554  1.1  christos      contents of LHS (unless == CONTAINER).  Returns the modified
    555  1.1  christos      CONTAINER.  */
    556  1.1  christos 
    557  1.1  christos   value *assign_aggregate (struct value *container,
    558  1.1  christos 			   struct value *lhs,
    559  1.1  christos 			   struct expression *exp);
    560  1.1  christos 
    561  1.1  christos   value *evaluate (struct type *expect_type,
    562  1.1  christos 		   struct expression *exp,
    563  1.1  christos 		   enum noside noside) override
    564  1.1  christos   {
    565  1.1  christos     error (_("Aggregates only allowed on the right of an assignment"));
    566  1.1  christos   }
    567  1.1  christos 
    568  1.1  christos   enum exp_opcode opcode () const override
    569  1.1  christos   { return OP_AGGREGATE; }
    570  1.1  christos };
    571  1.1  christos 
    572  1.1  christos /* A component holding a vector of other components to assign.  */
    573  1.1  christos class ada_aggregate_component : public ada_component
    574  1.1  christos {
    575  1.1  christos public:
    576  1.1  christos 
    577  1.1  christos   explicit ada_aggregate_component (std::vector<ada_component_up> &&components)
    578  1.1  christos     : m_components (std::move (components))
    579  1.1  christos   {
    580  1.1  christos   }
    581  1.1  christos 
    582  1.1  christos   void assign (struct value *container,
    583  1.1  christos 	       struct value *lhs, struct expression *exp,
    584  1.1  christos 	       std::vector<LONGEST> &indices,
    585  1.1  christos 	       LONGEST low, LONGEST high) override;
    586  1.1  christos 
    587  1.1  christos   bool uses_objfile (struct objfile *objfile) override;
    588  1.1  christos 
    589  1.1  christos   void dump (ui_file *stream, int depth) override;
    590  1.1  christos 
    591  1.1  christos private:
    592  1.1  christos 
    593  1.1  christos   std::vector<ada_component_up> m_components;
    594  1.1  christos };
    595  1.1  christos 
    596  1.1  christos /* A component that assigns according to a provided index (which is
    597  1.1  christos    relative to the "low" value).  */
    598  1.1  christos class ada_positional_component : public ada_component
    599  1.1  christos {
    600  1.1  christos public:
    601  1.1  christos 
    602  1.1  christos   ada_positional_component (int index, operation_up &&op)
    603  1.1  christos     : m_index (index),
    604  1.1  christos       m_op (std::move (op))
    605  1.1  christos   {
    606  1.1  christos   }
    607  1.1  christos 
    608  1.1  christos   void assign (struct value *container,
    609  1.1  christos 	       struct value *lhs, struct expression *exp,
    610  1.1  christos 	       std::vector<LONGEST> &indices,
    611  1.1  christos 	       LONGEST low, LONGEST high) override;
    612  1.1  christos 
    613  1.1  christos   bool uses_objfile (struct objfile *objfile) override;
    614  1.1  christos 
    615  1.1  christos   void dump (ui_file *stream, int depth) override;
    616  1.1  christos 
    617  1.1  christos private:
    618  1.1  christos 
    619  1.1  christos   int m_index;
    620  1.1  christos   operation_up m_op;
    621  1.1  christos };
    622  1.1  christos 
    623  1.1  christos /* A component which handles an "others" clause.  */
    624  1.1  christos class ada_others_component : public ada_component
    625  1.1  christos {
    626  1.1  christos public:
    627  1.1  christos 
    628  1.1  christos   explicit ada_others_component (operation_up &&op)
    629  1.1  christos     : m_op (std::move (op))
    630  1.1  christos   {
    631  1.1  christos   }
    632  1.1  christos 
    633  1.1  christos   void assign (struct value *container,
    634  1.1  christos 	       struct value *lhs, struct expression *exp,
    635  1.1  christos 	       std::vector<LONGEST> &indices,
    636  1.1  christos 	       LONGEST low, LONGEST high) override;
    637  1.1  christos 
    638  1.1  christos   bool uses_objfile (struct objfile *objfile) override;
    639  1.1  christos 
    640  1.1  christos   void dump (ui_file *stream, int depth) override;
    641  1.1  christos 
    642  1.1  christos private:
    643  1.1  christos 
    644  1.1  christos   operation_up m_op;
    645  1.1  christos };
    646  1.1  christos 
    647  1.1  christos /* An interface that represents an association that is used in
    648  1.1  christos    aggregate assignment.  */
    649  1.1  christos class ada_association
    650  1.1  christos {
    651  1.1  christos public:
    652  1.1  christos 
    653  1.1  christos   /* Like ada_component::assign, but takes an operation as a
    654  1.1  christos      parameter.  The operation is evaluated and then assigned into LHS
    655  1.1  christos      according to the rules of the concrete implementation.  */
    656  1.1  christos   virtual void assign (struct value *container,
    657  1.1  christos 		       struct value *lhs,
    658  1.1  christos 		       struct expression *exp,
    659  1.1  christos 		       std::vector<LONGEST> &indices,
    660  1.1  christos 		       LONGEST low, LONGEST high,
    661  1.1  christos 		       operation_up &op) = 0;
    662  1.1  christos 
    663  1.1  christos   /* Same as operation::uses_objfile.  */
    664  1.1  christos   virtual bool uses_objfile (struct objfile *objfile) = 0;
    665  1.1  christos 
    666  1.1  christos   /* Same as operation::dump.  */
    667  1.1  christos   virtual void dump (ui_file *stream, int depth) = 0;
    668  1.1  christos 
    669  1.1  christos   virtual ~ada_association () = default;
    670  1.1  christos 
    671  1.1  christos protected:
    672  1.1  christos 
    673  1.1  christos   ada_association () = default;
    674  1.1  christos   DISABLE_COPY_AND_ASSIGN (ada_association);
    675  1.1  christos };
    676  1.1  christos 
    677  1.1  christos /* Unique pointer specialization for Ada assignment associations.  */
    678  1.1  christos typedef std::unique_ptr<ada_association> ada_association_up;
    679  1.1  christos 
    680  1.1  christos /* A component that holds a vector of associations and an operation.
    681  1.1  christos    The operation is re-evaluated for each choice.  */
    682  1.1  christos class ada_choices_component : public ada_component
    683  1.1  christos {
    684  1.1  christos public:
    685  1.1  christos 
    686  1.1  christos   explicit ada_choices_component (operation_up &&op)
    687  1.1  christos     : m_op (std::move (op))
    688  1.1  christos   {
    689  1.1  christos   }
    690  1.1  christos 
    691  1.1  christos   /* Set the vector of associations.  This is done separately from the
    692  1.1  christos      constructor because it was simpler for the implementation of the
    693  1.1  christos      parser.  */
    694  1.1  christos   void set_associations (std::vector<ada_association_up> &&assoc)
    695  1.1  christos   {
    696  1.1  christos     m_assocs = std::move (assoc);
    697  1.1  christos   }
    698  1.1  christos 
    699  1.1  christos   void assign (struct value *container,
    700  1.1  christos 	       struct value *lhs, struct expression *exp,
    701  1.1  christos 	       std::vector<LONGEST> &indices,
    702  1.1  christos 	       LONGEST low, LONGEST high) override;
    703  1.1  christos 
    704  1.1  christos   bool uses_objfile (struct objfile *objfile) override;
    705  1.1  christos 
    706  1.1  christos   void dump (ui_file *stream, int depth) override;
    707  1.1  christos 
    708  1.1  christos private:
    709  1.1  christos 
    710  1.1  christos   std::vector<ada_association_up> m_assocs;
    711  1.1  christos   operation_up m_op;
    712  1.1  christos };
    713  1.1  christos 
    714  1.1  christos /* An association that uses a discrete range.  */
    715  1.1  christos class ada_discrete_range_association : public ada_association
    716  1.1  christos {
    717  1.1  christos public:
    718  1.1  christos 
    719  1.1  christos   ada_discrete_range_association (operation_up &&low, operation_up &&high)
    720  1.1  christos     : m_low (std::move (low)),
    721  1.1  christos       m_high (std::move (high))
    722  1.1  christos   {
    723  1.1  christos   }
    724  1.1  christos 
    725  1.1  christos   void assign (struct value *container,
    726  1.1  christos 	       struct value *lhs, struct expression *exp,
    727  1.1  christos 	       std::vector<LONGEST> &indices,
    728  1.1  christos 	       LONGEST low, LONGEST high,
    729  1.1  christos 	       operation_up &op) override;
    730  1.1  christos 
    731  1.1  christos   bool uses_objfile (struct objfile *objfile) override;
    732  1.1  christos 
    733  1.1  christos   void dump (ui_file *stream, int depth) override;
    734  1.1  christos 
    735  1.1  christos private:
    736  1.1  christos 
    737  1.1  christos   operation_up m_low;
    738  1.1  christos   operation_up m_high;
    739  1.1  christos };
    740  1.1  christos 
    741  1.1  christos /* An association that uses a name.  The name may be an expression
    742  1.1  christos    that evaluates to an integer (for arrays), or an Ada string or
    743  1.1  christos    variable value operation.  */
    744  1.1  christos class ada_name_association : public ada_association
    745  1.1  christos {
    746  1.1  christos public:
    747  1.1  christos 
    748  1.1  christos   explicit ada_name_association (operation_up val)
    749  1.1  christos     : m_val (std::move (val))
    750  1.1  christos   {
    751  1.1  christos   }
    752  1.1  christos 
    753  1.1  christos   void assign (struct value *container,
    754  1.1  christos 	       struct value *lhs, struct expression *exp,
    755  1.1  christos 	       std::vector<LONGEST> &indices,
    756  1.1  christos 	       LONGEST low, LONGEST high,
    757  1.1  christos 	       operation_up &op) override;
    758  1.1  christos 
    759  1.1  christos   bool uses_objfile (struct objfile *objfile) override;
    760  1.1  christos 
    761  1.1  christos   void dump (ui_file *stream, int depth) override;
    762  1.1  christos 
    763  1.1  christos private:
    764  1.1  christos 
    765  1.1  christos   operation_up m_val;
    766  1.1  christos };
    767  1.1  christos 
    768  1.1  christos /* A character constant expression.  This is a separate operation so
    769  1.1  christos    that it can participate in resolution, so that TYPE'(CST) can
    770  1.1  christos    work correctly for enums with character enumerators.  */
    771  1.1  christos class ada_char_operation : public long_const_operation,
    772  1.1  christos 			   public ada_resolvable
    773  1.1  christos {
    774  1.1  christos public:
    775  1.1  christos 
    776  1.1  christos   using long_const_operation::long_const_operation;
    777  1.1  christos 
    778  1.1  christos   bool resolve (struct expression *exp,
    779  1.1  christos 		bool deprocedure_p,
    780  1.1  christos 		bool parse_completion,
    781  1.1  christos 		innermost_block_tracker *tracker,
    782  1.1  christos 		struct type *context_type) override
    783  1.1  christos   {
    784  1.1  christos     /* This should never be called, because this class also implements
    785  1.1  christos        'replace'.  */
    786  1.1  christos     gdb_assert_not_reached ("unexpected call");
    787  1.1  christos   }
    788  1.1  christos 
    789  1.1  christos   operation_up replace (operation_up &&owner,
    790  1.1  christos 			struct expression *exp,
    791  1.1  christos 			bool deprocedure_p,
    792  1.1  christos 			bool parse_completion,
    793  1.1  christos 			innermost_block_tracker *tracker,
    794  1.1  christos 			struct type *context_type) override;
    795  1.1  christos 
    796  1.1  christos   value *evaluate (struct type *expect_type,
    797  1.1  christos 		   struct expression *exp,
    798  1.1  christos 		   enum noside noside) override;
    799  1.1  christos };
    800  1.1  christos 
    801  1.1  christos class ada_concat_operation : public concat_operation
    802  1.1  christos {
    803  1.1  christos public:
    804  1.1  christos 
    805  1.1  christos   using concat_operation::concat_operation;
    806  1.1  christos 
    807  1.1  christos   value *evaluate (struct type *expect_type,
    808  1.1  christos 		   struct expression *exp,
    809  1.1  christos 		   enum noside noside) override;
    810  1.1  christos };
    811  1.1  christos 
    812  1.1  christos } /* namespace expr */
    813  1.1  christos 
    814  1.1  christos #endif /* ADA_EXP_H */
    815