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