1*6881a400Schristos /* Definitions for expressions in GDB 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 EXPOP_H 21*6881a400Schristos #define EXPOP_H 22*6881a400Schristos 23*6881a400Schristos #include "block.h" 24*6881a400Schristos #include "c-lang.h" 25*6881a400Schristos #include "cp-abi.h" 26*6881a400Schristos #include "expression.h" 27*6881a400Schristos #include "objfiles.h" 28*6881a400Schristos #include "gdbsupport/traits.h" 29*6881a400Schristos #include "gdbsupport/enum-flags.h" 30*6881a400Schristos 31*6881a400Schristos struct agent_expr; 32*6881a400Schristos struct axs_value; 33*6881a400Schristos 34*6881a400Schristos extern void gen_expr_binop (struct expression *exp, 35*6881a400Schristos enum exp_opcode op, 36*6881a400Schristos expr::operation *lhs, expr::operation *rhs, 37*6881a400Schristos struct agent_expr *ax, struct axs_value *value); 38*6881a400Schristos extern void gen_expr_structop (struct expression *exp, 39*6881a400Schristos enum exp_opcode op, 40*6881a400Schristos expr::operation *lhs, 41*6881a400Schristos const char *name, 42*6881a400Schristos struct agent_expr *ax, struct axs_value *value); 43*6881a400Schristos extern void gen_expr_unop (struct expression *exp, 44*6881a400Schristos enum exp_opcode op, 45*6881a400Schristos expr::operation *lhs, 46*6881a400Schristos struct agent_expr *ax, struct axs_value *value); 47*6881a400Schristos 48*6881a400Schristos extern struct value *eval_op_scope (struct type *expect_type, 49*6881a400Schristos struct expression *exp, 50*6881a400Schristos enum noside noside, 51*6881a400Schristos struct type *type, const char *string); 52*6881a400Schristos extern struct value *eval_op_var_msym_value (struct type *expect_type, 53*6881a400Schristos struct expression *exp, 54*6881a400Schristos enum noside noside, 55*6881a400Schristos bool outermost_p, 56*6881a400Schristos bound_minimal_symbol msymbol); 57*6881a400Schristos extern struct value *eval_op_var_entry_value (struct type *expect_type, 58*6881a400Schristos struct expression *exp, 59*6881a400Schristos enum noside noside, symbol *sym); 60*6881a400Schristos extern struct value *eval_op_func_static_var (struct type *expect_type, 61*6881a400Schristos struct expression *exp, 62*6881a400Schristos enum noside noside, 63*6881a400Schristos value *func, const char *var); 64*6881a400Schristos extern struct value *eval_op_register (struct type *expect_type, 65*6881a400Schristos struct expression *exp, 66*6881a400Schristos enum noside noside, const char *name); 67*6881a400Schristos extern struct value *eval_op_ternop (struct type *expect_type, 68*6881a400Schristos struct expression *exp, 69*6881a400Schristos enum noside noside, 70*6881a400Schristos struct value *array, struct value *low, 71*6881a400Schristos struct value *upper); 72*6881a400Schristos extern struct value *eval_op_structop_struct (struct type *expect_type, 73*6881a400Schristos struct expression *exp, 74*6881a400Schristos enum noside noside, 75*6881a400Schristos struct value *arg1, 76*6881a400Schristos const char *string); 77*6881a400Schristos extern struct value *eval_op_structop_ptr (struct type *expect_type, 78*6881a400Schristos struct expression *exp, 79*6881a400Schristos enum noside noside, 80*6881a400Schristos struct value *arg1, 81*6881a400Schristos const char *string); 82*6881a400Schristos extern struct value *eval_op_member (struct type *expect_type, 83*6881a400Schristos struct expression *exp, 84*6881a400Schristos enum noside noside, 85*6881a400Schristos struct value *arg1, struct value *arg2); 86*6881a400Schristos extern struct value *eval_op_add (struct type *expect_type, 87*6881a400Schristos struct expression *exp, 88*6881a400Schristos enum noside noside, 89*6881a400Schristos struct value *arg1, struct value *arg2); 90*6881a400Schristos extern struct value *eval_op_sub (struct type *expect_type, 91*6881a400Schristos struct expression *exp, 92*6881a400Schristos enum noside noside, 93*6881a400Schristos struct value *arg1, struct value *arg2); 94*6881a400Schristos extern struct value *eval_op_binary (struct type *expect_type, 95*6881a400Schristos struct expression *exp, 96*6881a400Schristos enum noside noside, enum exp_opcode op, 97*6881a400Schristos struct value *arg1, struct value *arg2); 98*6881a400Schristos extern struct value *eval_op_subscript (struct type *expect_type, 99*6881a400Schristos struct expression *exp, 100*6881a400Schristos enum noside noside, enum exp_opcode op, 101*6881a400Schristos struct value *arg1, 102*6881a400Schristos struct value *arg2); 103*6881a400Schristos extern struct value *eval_op_equal (struct type *expect_type, 104*6881a400Schristos struct expression *exp, 105*6881a400Schristos enum noside noside, enum exp_opcode op, 106*6881a400Schristos struct value *arg1, 107*6881a400Schristos struct value *arg2); 108*6881a400Schristos extern struct value *eval_op_notequal (struct type *expect_type, 109*6881a400Schristos struct expression *exp, 110*6881a400Schristos enum noside noside, enum exp_opcode op, 111*6881a400Schristos struct value *arg1, 112*6881a400Schristos struct value *arg2); 113*6881a400Schristos extern struct value *eval_op_less (struct type *expect_type, 114*6881a400Schristos struct expression *exp, 115*6881a400Schristos enum noside noside, enum exp_opcode op, 116*6881a400Schristos struct value *arg1, 117*6881a400Schristos struct value *arg2); 118*6881a400Schristos extern struct value *eval_op_gtr (struct type *expect_type, 119*6881a400Schristos struct expression *exp, 120*6881a400Schristos enum noside noside, enum exp_opcode op, 121*6881a400Schristos struct value *arg1, 122*6881a400Schristos struct value *arg2); 123*6881a400Schristos extern struct value *eval_op_geq (struct type *expect_type, 124*6881a400Schristos struct expression *exp, 125*6881a400Schristos enum noside noside, enum exp_opcode op, 126*6881a400Schristos struct value *arg1, 127*6881a400Schristos struct value *arg2); 128*6881a400Schristos extern struct value *eval_op_leq (struct type *expect_type, 129*6881a400Schristos struct expression *exp, 130*6881a400Schristos enum noside noside, enum exp_opcode op, 131*6881a400Schristos struct value *arg1, 132*6881a400Schristos struct value *arg2); 133*6881a400Schristos extern struct value *eval_op_repeat (struct type *expect_type, 134*6881a400Schristos struct expression *exp, 135*6881a400Schristos enum noside noside, enum exp_opcode op, 136*6881a400Schristos struct value *arg1, 137*6881a400Schristos struct value *arg2); 138*6881a400Schristos extern struct value *eval_op_plus (struct type *expect_type, 139*6881a400Schristos struct expression *exp, 140*6881a400Schristos enum noside noside, enum exp_opcode op, 141*6881a400Schristos struct value *arg1); 142*6881a400Schristos extern struct value *eval_op_neg (struct type *expect_type, 143*6881a400Schristos struct expression *exp, 144*6881a400Schristos enum noside noside, enum exp_opcode op, 145*6881a400Schristos struct value *arg1); 146*6881a400Schristos extern struct value *eval_op_complement (struct type *expect_type, 147*6881a400Schristos struct expression *exp, 148*6881a400Schristos enum noside noside, 149*6881a400Schristos enum exp_opcode op, 150*6881a400Schristos struct value *arg1); 151*6881a400Schristos extern struct value *eval_op_lognot (struct type *expect_type, 152*6881a400Schristos struct expression *exp, 153*6881a400Schristos enum noside noside, 154*6881a400Schristos enum exp_opcode op, 155*6881a400Schristos struct value *arg1); 156*6881a400Schristos extern struct value *eval_op_preinc (struct type *expect_type, 157*6881a400Schristos struct expression *exp, 158*6881a400Schristos enum noside noside, 159*6881a400Schristos enum exp_opcode op, 160*6881a400Schristos struct value *arg1); 161*6881a400Schristos extern struct value *eval_op_predec (struct type *expect_type, 162*6881a400Schristos struct expression *exp, 163*6881a400Schristos enum noside noside, 164*6881a400Schristos enum exp_opcode op, 165*6881a400Schristos struct value *arg1); 166*6881a400Schristos extern struct value *eval_op_postinc (struct type *expect_type, 167*6881a400Schristos struct expression *exp, 168*6881a400Schristos enum noside noside, 169*6881a400Schristos enum exp_opcode op, 170*6881a400Schristos struct value *arg1); 171*6881a400Schristos extern struct value *eval_op_postdec (struct type *expect_type, 172*6881a400Schristos struct expression *exp, 173*6881a400Schristos enum noside noside, 174*6881a400Schristos enum exp_opcode op, 175*6881a400Schristos struct value *arg1); 176*6881a400Schristos extern struct value *eval_op_ind (struct type *expect_type, 177*6881a400Schristos struct expression *exp, 178*6881a400Schristos enum noside noside, 179*6881a400Schristos struct value *arg1); 180*6881a400Schristos extern struct value *eval_op_type (struct type *expect_type, 181*6881a400Schristos struct expression *exp, 182*6881a400Schristos enum noside noside, struct type *type); 183*6881a400Schristos extern struct value *eval_op_alignof (struct type *expect_type, 184*6881a400Schristos struct expression *exp, 185*6881a400Schristos enum noside noside, 186*6881a400Schristos struct value *arg1); 187*6881a400Schristos extern struct value *eval_op_memval (struct type *expect_type, 188*6881a400Schristos struct expression *exp, 189*6881a400Schristos enum noside noside, 190*6881a400Schristos struct value *arg1, struct type *type); 191*6881a400Schristos extern struct value *eval_binop_assign_modify (struct type *expect_type, 192*6881a400Schristos struct expression *exp, 193*6881a400Schristos enum noside noside, 194*6881a400Schristos enum exp_opcode op, 195*6881a400Schristos struct value *arg1, 196*6881a400Schristos struct value *arg2); 197*6881a400Schristos 198*6881a400Schristos namespace expr 199*6881a400Schristos { 200*6881a400Schristos 201*6881a400Schristos class ada_component; 202*6881a400Schristos 203*6881a400Schristos /* The check_objfile overloads are used to check whether a particular 204*6881a400Schristos component of some operation references an objfile. The passed-in 205*6881a400Schristos objfile will never be a debug objfile. */ 206*6881a400Schristos 207*6881a400Schristos /* See if EXP_OBJFILE matches OBJFILE. */ 208*6881a400Schristos static inline bool 209*6881a400Schristos check_objfile (struct objfile *exp_objfile, struct objfile *objfile) 210*6881a400Schristos { 211*6881a400Schristos if (exp_objfile->separate_debug_objfile_backlink) 212*6881a400Schristos exp_objfile = exp_objfile->separate_debug_objfile_backlink; 213*6881a400Schristos return exp_objfile == objfile; 214*6881a400Schristos } 215*6881a400Schristos 216*6881a400Schristos static inline bool 217*6881a400Schristos check_objfile (struct type *type, struct objfile *objfile) 218*6881a400Schristos { 219*6881a400Schristos struct objfile *ty_objfile = type->objfile_owner (); 220*6881a400Schristos if (ty_objfile != nullptr) 221*6881a400Schristos return check_objfile (ty_objfile, objfile); 222*6881a400Schristos return false; 223*6881a400Schristos } 224*6881a400Schristos 225*6881a400Schristos static inline bool 226*6881a400Schristos check_objfile (struct symbol *sym, struct objfile *objfile) 227*6881a400Schristos { 228*6881a400Schristos return check_objfile (sym->objfile (), objfile); 229*6881a400Schristos } 230*6881a400Schristos 231*6881a400Schristos static inline bool 232*6881a400Schristos check_objfile (const struct block *block, struct objfile *objfile) 233*6881a400Schristos { 234*6881a400Schristos return check_objfile (block_objfile (block), objfile); 235*6881a400Schristos } 236*6881a400Schristos 237*6881a400Schristos static inline bool 238*6881a400Schristos check_objfile (const block_symbol &sym, struct objfile *objfile) 239*6881a400Schristos { 240*6881a400Schristos return (check_objfile (sym.symbol, objfile) 241*6881a400Schristos || check_objfile (sym.block, objfile)); 242*6881a400Schristos } 243*6881a400Schristos 244*6881a400Schristos static inline bool 245*6881a400Schristos check_objfile (bound_minimal_symbol minsym, struct objfile *objfile) 246*6881a400Schristos { 247*6881a400Schristos return check_objfile (minsym.objfile, objfile); 248*6881a400Schristos } 249*6881a400Schristos 250*6881a400Schristos static inline bool 251*6881a400Schristos check_objfile (internalvar *ivar, struct objfile *objfile) 252*6881a400Schristos { 253*6881a400Schristos return false; 254*6881a400Schristos } 255*6881a400Schristos 256*6881a400Schristos static inline bool 257*6881a400Schristos check_objfile (const std::string &str, struct objfile *objfile) 258*6881a400Schristos { 259*6881a400Schristos return false; 260*6881a400Schristos } 261*6881a400Schristos 262*6881a400Schristos static inline bool 263*6881a400Schristos check_objfile (const operation_up &op, struct objfile *objfile) 264*6881a400Schristos { 265*6881a400Schristos return op->uses_objfile (objfile); 266*6881a400Schristos } 267*6881a400Schristos 268*6881a400Schristos static inline bool 269*6881a400Schristos check_objfile (enum exp_opcode val, struct objfile *objfile) 270*6881a400Schristos { 271*6881a400Schristos return false; 272*6881a400Schristos } 273*6881a400Schristos 274*6881a400Schristos static inline bool 275*6881a400Schristos check_objfile (ULONGEST val, struct objfile *objfile) 276*6881a400Schristos { 277*6881a400Schristos return false; 278*6881a400Schristos } 279*6881a400Schristos 280*6881a400Schristos template<typename T> 281*6881a400Schristos static inline bool 282*6881a400Schristos check_objfile (enum_flags<T> val, struct objfile *objfile) 283*6881a400Schristos { 284*6881a400Schristos return false; 285*6881a400Schristos } 286*6881a400Schristos 287*6881a400Schristos template<typename T> 288*6881a400Schristos static inline bool 289*6881a400Schristos check_objfile (const std::vector<T> &collection, struct objfile *objfile) 290*6881a400Schristos { 291*6881a400Schristos for (const auto &item : collection) 292*6881a400Schristos { 293*6881a400Schristos if (check_objfile (item, objfile)) 294*6881a400Schristos return true; 295*6881a400Schristos } 296*6881a400Schristos return false; 297*6881a400Schristos } 298*6881a400Schristos 299*6881a400Schristos template<typename S, typename T> 300*6881a400Schristos static inline bool 301*6881a400Schristos check_objfile (const std::pair<S, T> &item, struct objfile *objfile) 302*6881a400Schristos { 303*6881a400Schristos return (check_objfile (item.first, objfile) 304*6881a400Schristos || check_objfile (item.second, objfile)); 305*6881a400Schristos } 306*6881a400Schristos 307*6881a400Schristos extern bool check_objfile (const std::unique_ptr<ada_component> &comp, 308*6881a400Schristos struct objfile *objfile); 309*6881a400Schristos 310*6881a400Schristos static inline void 311*6881a400Schristos dump_for_expression (struct ui_file *stream, int depth, 312*6881a400Schristos const operation_up &op) 313*6881a400Schristos { 314*6881a400Schristos op->dump (stream, depth); 315*6881a400Schristos } 316*6881a400Schristos 317*6881a400Schristos extern void dump_for_expression (struct ui_file *stream, int depth, 318*6881a400Schristos enum exp_opcode op); 319*6881a400Schristos extern void dump_for_expression (struct ui_file *stream, int depth, 320*6881a400Schristos const std::string &str); 321*6881a400Schristos extern void dump_for_expression (struct ui_file *stream, int depth, 322*6881a400Schristos struct type *type); 323*6881a400Schristos extern void dump_for_expression (struct ui_file *stream, int depth, 324*6881a400Schristos CORE_ADDR addr); 325*6881a400Schristos extern void dump_for_expression (struct ui_file *stream, int depth, 326*6881a400Schristos internalvar *ivar); 327*6881a400Schristos extern void dump_for_expression (struct ui_file *stream, int depth, 328*6881a400Schristos symbol *sym); 329*6881a400Schristos extern void dump_for_expression (struct ui_file *stream, int depth, 330*6881a400Schristos const block_symbol &sym); 331*6881a400Schristos extern void dump_for_expression (struct ui_file *stream, int depth, 332*6881a400Schristos bound_minimal_symbol msym); 333*6881a400Schristos extern void dump_for_expression (struct ui_file *stream, int depth, 334*6881a400Schristos const block *bl); 335*6881a400Schristos extern void dump_for_expression (struct ui_file *stream, int depth, 336*6881a400Schristos type_instance_flags flags); 337*6881a400Schristos extern void dump_for_expression (struct ui_file *stream, int depth, 338*6881a400Schristos enum c_string_type_values flags); 339*6881a400Schristos extern void dump_for_expression (struct ui_file *stream, int depth, 340*6881a400Schristos enum range_flag flags); 341*6881a400Schristos extern void dump_for_expression (struct ui_file *stream, int depth, 342*6881a400Schristos const std::unique_ptr<ada_component> &comp); 343*6881a400Schristos 344*6881a400Schristos template<typename T> 345*6881a400Schristos void 346*6881a400Schristos dump_for_expression (struct ui_file *stream, int depth, 347*6881a400Schristos const std::vector<T> &vals) 348*6881a400Schristos { 349*6881a400Schristos gdb_printf (stream, _("%*sVector:\n"), depth, ""); 350*6881a400Schristos for (auto &item : vals) 351*6881a400Schristos dump_for_expression (stream, depth + 1, item); 352*6881a400Schristos } 353*6881a400Schristos 354*6881a400Schristos template<typename X, typename Y> 355*6881a400Schristos void 356*6881a400Schristos dump_for_expression (struct ui_file *stream, int depth, 357*6881a400Schristos const std::pair<X, Y> &vals) 358*6881a400Schristos { 359*6881a400Schristos dump_for_expression (stream, depth, vals.first); 360*6881a400Schristos dump_for_expression (stream, depth, vals.second); 361*6881a400Schristos } 362*6881a400Schristos 363*6881a400Schristos /* Base class for most concrete operations. This class holds data, 364*6881a400Schristos specified via template parameters, and supplies generic 365*6881a400Schristos implementations of the 'dump' and 'uses_objfile' methods. */ 366*6881a400Schristos template<typename... Arg> 367*6881a400Schristos class tuple_holding_operation : public operation 368*6881a400Schristos { 369*6881a400Schristos public: 370*6881a400Schristos 371*6881a400Schristos explicit tuple_holding_operation (Arg... args) 372*6881a400Schristos : m_storage (std::forward<Arg> (args)...) 373*6881a400Schristos { 374*6881a400Schristos } 375*6881a400Schristos 376*6881a400Schristos DISABLE_COPY_AND_ASSIGN (tuple_holding_operation); 377*6881a400Schristos 378*6881a400Schristos bool uses_objfile (struct objfile *objfile) const override 379*6881a400Schristos { 380*6881a400Schristos return do_check_objfile<0, Arg...> (objfile, m_storage); 381*6881a400Schristos } 382*6881a400Schristos 383*6881a400Schristos void dump (struct ui_file *stream, int depth) const override 384*6881a400Schristos { 385*6881a400Schristos dump_for_expression (stream, depth, opcode ()); 386*6881a400Schristos do_dump<0, Arg...> (stream, depth + 1, m_storage); 387*6881a400Schristos } 388*6881a400Schristos 389*6881a400Schristos protected: 390*6881a400Schristos 391*6881a400Schristos /* Storage for the data. */ 392*6881a400Schristos std::tuple<Arg...> m_storage; 393*6881a400Schristos 394*6881a400Schristos private: 395*6881a400Schristos 396*6881a400Schristos /* do_dump does the work of dumping the data. */ 397*6881a400Schristos template<int I, typename... T> 398*6881a400Schristos typename std::enable_if<I == sizeof... (T), void>::type 399*6881a400Schristos do_dump (struct ui_file *stream, int depth, const std::tuple<T...> &value) 400*6881a400Schristos const 401*6881a400Schristos { 402*6881a400Schristos } 403*6881a400Schristos 404*6881a400Schristos template<int I, typename... T> 405*6881a400Schristos typename std::enable_if<I < sizeof... (T), void>::type 406*6881a400Schristos do_dump (struct ui_file *stream, int depth, const std::tuple<T...> &value) 407*6881a400Schristos const 408*6881a400Schristos { 409*6881a400Schristos dump_for_expression (stream, depth, std::get<I> (value)); 410*6881a400Schristos do_dump<I + 1, T...> (stream, depth, value); 411*6881a400Schristos } 412*6881a400Schristos 413*6881a400Schristos /* do_check_objfile does the work of checking whether this object 414*6881a400Schristos refers to OBJFILE. */ 415*6881a400Schristos template<int I, typename... T> 416*6881a400Schristos typename std::enable_if<I == sizeof... (T), bool>::type 417*6881a400Schristos do_check_objfile (struct objfile *objfile, const std::tuple<T...> &value) 418*6881a400Schristos const 419*6881a400Schristos { 420*6881a400Schristos return false; 421*6881a400Schristos } 422*6881a400Schristos 423*6881a400Schristos template<int I, typename... T> 424*6881a400Schristos typename std::enable_if<I < sizeof... (T), bool>::type 425*6881a400Schristos do_check_objfile (struct objfile *objfile, const std::tuple<T...> &value) 426*6881a400Schristos const 427*6881a400Schristos { 428*6881a400Schristos if (check_objfile (std::get<I> (value), objfile)) 429*6881a400Schristos return true; 430*6881a400Schristos return do_check_objfile<I + 1, T...> (objfile, value); 431*6881a400Schristos } 432*6881a400Schristos }; 433*6881a400Schristos 434*6881a400Schristos /* The check_constant overloads are used to decide whether a given 435*6881a400Schristos concrete operation is a constant. This is done by checking the 436*6881a400Schristos operands. */ 437*6881a400Schristos 438*6881a400Schristos static inline bool 439*6881a400Schristos check_constant (const operation_up &item) 440*6881a400Schristos { 441*6881a400Schristos return item->constant_p (); 442*6881a400Schristos } 443*6881a400Schristos 444*6881a400Schristos static inline bool 445*6881a400Schristos check_constant (bound_minimal_symbol msym) 446*6881a400Schristos { 447*6881a400Schristos return false; 448*6881a400Schristos } 449*6881a400Schristos 450*6881a400Schristos static inline bool 451*6881a400Schristos check_constant (struct type *type) 452*6881a400Schristos { 453*6881a400Schristos return true; 454*6881a400Schristos } 455*6881a400Schristos 456*6881a400Schristos static inline bool 457*6881a400Schristos check_constant (const struct block *block) 458*6881a400Schristos { 459*6881a400Schristos return true; 460*6881a400Schristos } 461*6881a400Schristos 462*6881a400Schristos static inline bool 463*6881a400Schristos check_constant (const std::string &str) 464*6881a400Schristos { 465*6881a400Schristos return true; 466*6881a400Schristos } 467*6881a400Schristos 468*6881a400Schristos static inline bool 469*6881a400Schristos check_constant (ULONGEST cst) 470*6881a400Schristos { 471*6881a400Schristos return true; 472*6881a400Schristos } 473*6881a400Schristos 474*6881a400Schristos static inline bool 475*6881a400Schristos check_constant (struct symbol *sym) 476*6881a400Schristos { 477*6881a400Schristos enum address_class sc = sym->aclass (); 478*6881a400Schristos return (sc == LOC_BLOCK 479*6881a400Schristos || sc == LOC_CONST 480*6881a400Schristos || sc == LOC_CONST_BYTES 481*6881a400Schristos || sc == LOC_LABEL); 482*6881a400Schristos } 483*6881a400Schristos 484*6881a400Schristos static inline bool 485*6881a400Schristos check_constant (const block_symbol &sym) 486*6881a400Schristos { 487*6881a400Schristos /* We know the block is constant, so we only need to check the 488*6881a400Schristos symbol. */ 489*6881a400Schristos return check_constant (sym.symbol); 490*6881a400Schristos } 491*6881a400Schristos 492*6881a400Schristos template<typename T> 493*6881a400Schristos static inline bool 494*6881a400Schristos check_constant (const std::vector<T> &collection) 495*6881a400Schristos { 496*6881a400Schristos for (const auto &item : collection) 497*6881a400Schristos if (!check_constant (item)) 498*6881a400Schristos return false; 499*6881a400Schristos return true; 500*6881a400Schristos } 501*6881a400Schristos 502*6881a400Schristos template<typename S, typename T> 503*6881a400Schristos static inline bool 504*6881a400Schristos check_constant (const std::pair<S, T> &item) 505*6881a400Schristos { 506*6881a400Schristos return check_constant (item.first) && check_constant (item.second); 507*6881a400Schristos } 508*6881a400Schristos 509*6881a400Schristos /* Base class for concrete operations. This class supplies an 510*6881a400Schristos implementation of 'constant_p' that works by checking the 511*6881a400Schristos operands. */ 512*6881a400Schristos template<typename... Arg> 513*6881a400Schristos class maybe_constant_operation 514*6881a400Schristos : public tuple_holding_operation<Arg...> 515*6881a400Schristos { 516*6881a400Schristos public: 517*6881a400Schristos 518*6881a400Schristos using tuple_holding_operation<Arg...>::tuple_holding_operation; 519*6881a400Schristos 520*6881a400Schristos bool constant_p () const override 521*6881a400Schristos { 522*6881a400Schristos return do_check_constant<0, Arg...> (this->m_storage); 523*6881a400Schristos } 524*6881a400Schristos 525*6881a400Schristos private: 526*6881a400Schristos 527*6881a400Schristos template<int I, typename... T> 528*6881a400Schristos typename std::enable_if<I == sizeof... (T), bool>::type 529*6881a400Schristos do_check_constant (const std::tuple<T...> &value) const 530*6881a400Schristos { 531*6881a400Schristos return true; 532*6881a400Schristos } 533*6881a400Schristos 534*6881a400Schristos template<int I, typename... T> 535*6881a400Schristos typename std::enable_if<I < sizeof... (T), bool>::type 536*6881a400Schristos do_check_constant (const std::tuple<T...> &value) const 537*6881a400Schristos { 538*6881a400Schristos if (!check_constant (std::get<I> (value))) 539*6881a400Schristos return false; 540*6881a400Schristos return do_check_constant<I + 1, T...> (value); 541*6881a400Schristos } 542*6881a400Schristos }; 543*6881a400Schristos 544*6881a400Schristos /* A floating-point constant. The constant is encoded in the target 545*6881a400Schristos format. */ 546*6881a400Schristos 547*6881a400Schristos typedef std::array<gdb_byte, 16> float_data; 548*6881a400Schristos 549*6881a400Schristos /* An operation that holds a floating-point constant of a given 550*6881a400Schristos type. 551*6881a400Schristos 552*6881a400Schristos This does not need the facilities provided by 553*6881a400Schristos tuple_holding_operation, so it does not use it. */ 554*6881a400Schristos class float_const_operation 555*6881a400Schristos : public operation 556*6881a400Schristos { 557*6881a400Schristos public: 558*6881a400Schristos 559*6881a400Schristos float_const_operation (struct type *type, float_data data) 560*6881a400Schristos : m_type (type), 561*6881a400Schristos m_data (data) 562*6881a400Schristos { 563*6881a400Schristos } 564*6881a400Schristos 565*6881a400Schristos value *evaluate (struct type *expect_type, 566*6881a400Schristos struct expression *exp, 567*6881a400Schristos enum noside noside) override 568*6881a400Schristos { 569*6881a400Schristos return value_from_contents (m_type, m_data.data ()); 570*6881a400Schristos } 571*6881a400Schristos 572*6881a400Schristos enum exp_opcode opcode () const override 573*6881a400Schristos { return OP_FLOAT; } 574*6881a400Schristos 575*6881a400Schristos bool constant_p () const override 576*6881a400Schristos { return true; } 577*6881a400Schristos 578*6881a400Schristos void dump (struct ui_file *stream, int depth) const override; 579*6881a400Schristos 580*6881a400Schristos private: 581*6881a400Schristos 582*6881a400Schristos struct type *m_type; 583*6881a400Schristos float_data m_data; 584*6881a400Schristos }; 585*6881a400Schristos 586*6881a400Schristos class scope_operation 587*6881a400Schristos : public maybe_constant_operation<struct type *, std::string> 588*6881a400Schristos { 589*6881a400Schristos public: 590*6881a400Schristos 591*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 592*6881a400Schristos 593*6881a400Schristos value *evaluate (struct type *expect_type, 594*6881a400Schristos struct expression *exp, 595*6881a400Schristos enum noside noside) override 596*6881a400Schristos { 597*6881a400Schristos return eval_op_scope (expect_type, exp, noside, 598*6881a400Schristos std::get<0> (m_storage), 599*6881a400Schristos std::get<1> (m_storage).c_str ()); 600*6881a400Schristos } 601*6881a400Schristos 602*6881a400Schristos value *evaluate_for_address (struct expression *exp, 603*6881a400Schristos enum noside noside) override; 604*6881a400Schristos 605*6881a400Schristos value *evaluate_funcall (struct type *expect_type, 606*6881a400Schristos struct expression *exp, 607*6881a400Schristos enum noside noside, 608*6881a400Schristos const std::vector<operation_up> &args) override; 609*6881a400Schristos 610*6881a400Schristos enum exp_opcode opcode () const override 611*6881a400Schristos { return OP_SCOPE; } 612*6881a400Schristos 613*6881a400Schristos protected: 614*6881a400Schristos 615*6881a400Schristos void do_generate_ax (struct expression *exp, 616*6881a400Schristos struct agent_expr *ax, 617*6881a400Schristos struct axs_value *value, 618*6881a400Schristos struct type *cast_type) 619*6881a400Schristos override; 620*6881a400Schristos }; 621*6881a400Schristos 622*6881a400Schristos /* Compute the value of a variable. */ 623*6881a400Schristos class var_value_operation 624*6881a400Schristos : public maybe_constant_operation<block_symbol> 625*6881a400Schristos { 626*6881a400Schristos public: 627*6881a400Schristos 628*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 629*6881a400Schristos 630*6881a400Schristos value *evaluate (struct type *expect_type, 631*6881a400Schristos struct expression *exp, 632*6881a400Schristos enum noside noside) override; 633*6881a400Schristos 634*6881a400Schristos value *evaluate_with_coercion (struct expression *exp, 635*6881a400Schristos enum noside noside) override; 636*6881a400Schristos 637*6881a400Schristos value *evaluate_for_sizeof (struct expression *exp, enum noside noside) 638*6881a400Schristos override; 639*6881a400Schristos 640*6881a400Schristos value *evaluate_for_cast (struct type *expect_type, 641*6881a400Schristos struct expression *exp, 642*6881a400Schristos enum noside noside) override; 643*6881a400Schristos 644*6881a400Schristos value *evaluate_for_address (struct expression *exp, enum noside noside) 645*6881a400Schristos override; 646*6881a400Schristos 647*6881a400Schristos value *evaluate_funcall (struct type *expect_type, 648*6881a400Schristos struct expression *exp, 649*6881a400Schristos enum noside noside, 650*6881a400Schristos const std::vector<operation_up> &args) override; 651*6881a400Schristos 652*6881a400Schristos enum exp_opcode opcode () const override 653*6881a400Schristos { return OP_VAR_VALUE; } 654*6881a400Schristos 655*6881a400Schristos /* Return the symbol referenced by this object. */ 656*6881a400Schristos symbol *get_symbol () const 657*6881a400Schristos { 658*6881a400Schristos return std::get<0> (m_storage).symbol; 659*6881a400Schristos } 660*6881a400Schristos 661*6881a400Schristos protected: 662*6881a400Schristos 663*6881a400Schristos void do_generate_ax (struct expression *exp, 664*6881a400Schristos struct agent_expr *ax, 665*6881a400Schristos struct axs_value *value, 666*6881a400Schristos struct type *cast_type) 667*6881a400Schristos override; 668*6881a400Schristos }; 669*6881a400Schristos 670*6881a400Schristos class long_const_operation 671*6881a400Schristos : public tuple_holding_operation<struct type *, LONGEST> 672*6881a400Schristos { 673*6881a400Schristos public: 674*6881a400Schristos 675*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 676*6881a400Schristos 677*6881a400Schristos value *evaluate (struct type *expect_type, 678*6881a400Schristos struct expression *exp, 679*6881a400Schristos enum noside noside) override 680*6881a400Schristos { 681*6881a400Schristos return value_from_longest (std::get<0> (m_storage), 682*6881a400Schristos std::get<1> (m_storage)); 683*6881a400Schristos } 684*6881a400Schristos 685*6881a400Schristos enum exp_opcode opcode () const override 686*6881a400Schristos { return OP_LONG; } 687*6881a400Schristos 688*6881a400Schristos bool constant_p () const override 689*6881a400Schristos { return true; } 690*6881a400Schristos 691*6881a400Schristos protected: 692*6881a400Schristos 693*6881a400Schristos void do_generate_ax (struct expression *exp, 694*6881a400Schristos struct agent_expr *ax, 695*6881a400Schristos struct axs_value *value, 696*6881a400Schristos struct type *cast_type) 697*6881a400Schristos override; 698*6881a400Schristos }; 699*6881a400Schristos 700*6881a400Schristos class var_msym_value_operation 701*6881a400Schristos : public maybe_constant_operation<bound_minimal_symbol> 702*6881a400Schristos { 703*6881a400Schristos public: 704*6881a400Schristos 705*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 706*6881a400Schristos 707*6881a400Schristos value *evaluate (struct type *expect_type, 708*6881a400Schristos struct expression *exp, 709*6881a400Schristos enum noside noside) override 710*6881a400Schristos { 711*6881a400Schristos return eval_op_var_msym_value (expect_type, exp, noside, m_outermost, 712*6881a400Schristos std::get<0> (m_storage)); 713*6881a400Schristos } 714*6881a400Schristos 715*6881a400Schristos value *evaluate_for_sizeof (struct expression *exp, enum noside noside) 716*6881a400Schristos override; 717*6881a400Schristos 718*6881a400Schristos value *evaluate_for_address (struct expression *exp, enum noside noside) 719*6881a400Schristos override; 720*6881a400Schristos 721*6881a400Schristos value *evaluate_for_cast (struct type *expect_type, 722*6881a400Schristos struct expression *exp, 723*6881a400Schristos enum noside noside) override; 724*6881a400Schristos 725*6881a400Schristos value *evaluate_funcall (struct type *expect_type, 726*6881a400Schristos struct expression *exp, 727*6881a400Schristos enum noside noside, 728*6881a400Schristos const std::vector<operation_up> &args) override 729*6881a400Schristos { 730*6881a400Schristos const char *name = std::get<0> (m_storage).minsym->print_name (); 731*6881a400Schristos return operation::evaluate_funcall (expect_type, exp, noside, name, args); 732*6881a400Schristos } 733*6881a400Schristos 734*6881a400Schristos enum exp_opcode opcode () const override 735*6881a400Schristos { return OP_VAR_MSYM_VALUE; } 736*6881a400Schristos 737*6881a400Schristos void set_outermost () override 738*6881a400Schristos { 739*6881a400Schristos m_outermost = true; 740*6881a400Schristos } 741*6881a400Schristos 742*6881a400Schristos protected: 743*6881a400Schristos 744*6881a400Schristos /* True if this is the outermost operation in the expression. */ 745*6881a400Schristos bool m_outermost = false; 746*6881a400Schristos 747*6881a400Schristos void do_generate_ax (struct expression *exp, 748*6881a400Schristos struct agent_expr *ax, 749*6881a400Schristos struct axs_value *value, 750*6881a400Schristos struct type *cast_type) 751*6881a400Schristos override; 752*6881a400Schristos }; 753*6881a400Schristos 754*6881a400Schristos class var_entry_value_operation 755*6881a400Schristos : public tuple_holding_operation<symbol *> 756*6881a400Schristos { 757*6881a400Schristos public: 758*6881a400Schristos 759*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 760*6881a400Schristos 761*6881a400Schristos value *evaluate (struct type *expect_type, 762*6881a400Schristos struct expression *exp, 763*6881a400Schristos enum noside noside) override 764*6881a400Schristos { 765*6881a400Schristos return eval_op_var_entry_value (expect_type, exp, noside, 766*6881a400Schristos std::get<0> (m_storage)); 767*6881a400Schristos } 768*6881a400Schristos 769*6881a400Schristos enum exp_opcode opcode () const override 770*6881a400Schristos { return OP_VAR_ENTRY_VALUE; } 771*6881a400Schristos }; 772*6881a400Schristos 773*6881a400Schristos class func_static_var_operation 774*6881a400Schristos : public maybe_constant_operation<operation_up, std::string> 775*6881a400Schristos { 776*6881a400Schristos public: 777*6881a400Schristos 778*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 779*6881a400Schristos 780*6881a400Schristos value *evaluate (struct type *expect_type, 781*6881a400Schristos struct expression *exp, 782*6881a400Schristos enum noside noside) override 783*6881a400Schristos { 784*6881a400Schristos value *func = std::get<0> (m_storage)->evaluate (nullptr, exp, noside); 785*6881a400Schristos return eval_op_func_static_var (expect_type, exp, noside, func, 786*6881a400Schristos std::get<1> (m_storage).c_str ()); 787*6881a400Schristos } 788*6881a400Schristos 789*6881a400Schristos enum exp_opcode opcode () const override 790*6881a400Schristos { return OP_FUNC_STATIC_VAR; } 791*6881a400Schristos }; 792*6881a400Schristos 793*6881a400Schristos class last_operation 794*6881a400Schristos : public tuple_holding_operation<int> 795*6881a400Schristos { 796*6881a400Schristos public: 797*6881a400Schristos 798*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 799*6881a400Schristos 800*6881a400Schristos value *evaluate (struct type *expect_type, 801*6881a400Schristos struct expression *exp, 802*6881a400Schristos enum noside noside) override 803*6881a400Schristos { 804*6881a400Schristos return access_value_history (std::get<0> (m_storage)); 805*6881a400Schristos } 806*6881a400Schristos 807*6881a400Schristos enum exp_opcode opcode () const override 808*6881a400Schristos { return OP_LAST; } 809*6881a400Schristos }; 810*6881a400Schristos 811*6881a400Schristos class register_operation 812*6881a400Schristos : public tuple_holding_operation<std::string> 813*6881a400Schristos { 814*6881a400Schristos public: 815*6881a400Schristos 816*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 817*6881a400Schristos 818*6881a400Schristos value *evaluate (struct type *expect_type, 819*6881a400Schristos struct expression *exp, 820*6881a400Schristos enum noside noside) override 821*6881a400Schristos { 822*6881a400Schristos return eval_op_register (expect_type, exp, noside, 823*6881a400Schristos std::get<0> (m_storage).c_str ()); 824*6881a400Schristos } 825*6881a400Schristos 826*6881a400Schristos enum exp_opcode opcode () const override 827*6881a400Schristos { return OP_REGISTER; } 828*6881a400Schristos 829*6881a400Schristos /* Return the name of the register. */ 830*6881a400Schristos const char *get_name () const 831*6881a400Schristos { 832*6881a400Schristos return std::get<0> (m_storage).c_str (); 833*6881a400Schristos } 834*6881a400Schristos 835*6881a400Schristos protected: 836*6881a400Schristos 837*6881a400Schristos void do_generate_ax (struct expression *exp, 838*6881a400Schristos struct agent_expr *ax, 839*6881a400Schristos struct axs_value *value, 840*6881a400Schristos struct type *cast_type) 841*6881a400Schristos override; 842*6881a400Schristos }; 843*6881a400Schristos 844*6881a400Schristos class bool_operation 845*6881a400Schristos : public tuple_holding_operation<bool> 846*6881a400Schristos { 847*6881a400Schristos public: 848*6881a400Schristos 849*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 850*6881a400Schristos 851*6881a400Schristos value *evaluate (struct type *expect_type, 852*6881a400Schristos struct expression *exp, 853*6881a400Schristos enum noside noside) override 854*6881a400Schristos { 855*6881a400Schristos struct type *type = language_bool_type (exp->language_defn, exp->gdbarch); 856*6881a400Schristos return value_from_longest (type, std::get<0> (m_storage)); 857*6881a400Schristos } 858*6881a400Schristos 859*6881a400Schristos enum exp_opcode opcode () const override 860*6881a400Schristos { return OP_BOOL; } 861*6881a400Schristos 862*6881a400Schristos bool constant_p () const override 863*6881a400Schristos { return true; } 864*6881a400Schristos }; 865*6881a400Schristos 866*6881a400Schristos class internalvar_operation 867*6881a400Schristos : public tuple_holding_operation<internalvar *> 868*6881a400Schristos { 869*6881a400Schristos public: 870*6881a400Schristos 871*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 872*6881a400Schristos 873*6881a400Schristos value *evaluate (struct type *expect_type, 874*6881a400Schristos struct expression *exp, 875*6881a400Schristos enum noside noside) override 876*6881a400Schristos { 877*6881a400Schristos return value_of_internalvar (exp->gdbarch, 878*6881a400Schristos std::get<0> (m_storage)); 879*6881a400Schristos } 880*6881a400Schristos 881*6881a400Schristos internalvar *get_internalvar () const 882*6881a400Schristos { 883*6881a400Schristos return std::get<0> (m_storage); 884*6881a400Schristos } 885*6881a400Schristos 886*6881a400Schristos enum exp_opcode opcode () const override 887*6881a400Schristos { return OP_INTERNALVAR; } 888*6881a400Schristos 889*6881a400Schristos protected: 890*6881a400Schristos 891*6881a400Schristos void do_generate_ax (struct expression *exp, 892*6881a400Schristos struct agent_expr *ax, 893*6881a400Schristos struct axs_value *value, 894*6881a400Schristos struct type *cast_type) 895*6881a400Schristos override; 896*6881a400Schristos }; 897*6881a400Schristos 898*6881a400Schristos class string_operation 899*6881a400Schristos : public tuple_holding_operation<std::string> 900*6881a400Schristos { 901*6881a400Schristos public: 902*6881a400Schristos 903*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 904*6881a400Schristos 905*6881a400Schristos value *evaluate (struct type *expect_type, 906*6881a400Schristos struct expression *exp, 907*6881a400Schristos enum noside noside) override; 908*6881a400Schristos 909*6881a400Schristos enum exp_opcode opcode () const override 910*6881a400Schristos { return OP_STRING; } 911*6881a400Schristos }; 912*6881a400Schristos 913*6881a400Schristos class ternop_slice_operation 914*6881a400Schristos : public maybe_constant_operation<operation_up, operation_up, operation_up> 915*6881a400Schristos { 916*6881a400Schristos public: 917*6881a400Schristos 918*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 919*6881a400Schristos 920*6881a400Schristos value *evaluate (struct type *expect_type, 921*6881a400Schristos struct expression *exp, 922*6881a400Schristos enum noside noside) override 923*6881a400Schristos { 924*6881a400Schristos struct value *array 925*6881a400Schristos = std::get<0> (m_storage)->evaluate (nullptr, exp, noside); 926*6881a400Schristos struct value *low 927*6881a400Schristos = std::get<1> (m_storage)->evaluate (nullptr, exp, noside); 928*6881a400Schristos struct value *upper 929*6881a400Schristos = std::get<2> (m_storage)->evaluate (nullptr, exp, noside); 930*6881a400Schristos return eval_op_ternop (expect_type, exp, noside, array, low, upper); 931*6881a400Schristos } 932*6881a400Schristos 933*6881a400Schristos enum exp_opcode opcode () const override 934*6881a400Schristos { return TERNOP_SLICE; } 935*6881a400Schristos }; 936*6881a400Schristos 937*6881a400Schristos class ternop_cond_operation 938*6881a400Schristos : public maybe_constant_operation<operation_up, operation_up, operation_up> 939*6881a400Schristos { 940*6881a400Schristos public: 941*6881a400Schristos 942*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 943*6881a400Schristos 944*6881a400Schristos value *evaluate (struct type *expect_type, 945*6881a400Schristos struct expression *exp, 946*6881a400Schristos enum noside noside) override 947*6881a400Schristos { 948*6881a400Schristos struct value *val 949*6881a400Schristos = std::get<0> (m_storage)->evaluate (nullptr, exp, noside); 950*6881a400Schristos 951*6881a400Schristos if (value_logical_not (val)) 952*6881a400Schristos return std::get<2> (m_storage)->evaluate (nullptr, exp, noside); 953*6881a400Schristos return std::get<1> (m_storage)->evaluate (nullptr, exp, noside); 954*6881a400Schristos } 955*6881a400Schristos 956*6881a400Schristos enum exp_opcode opcode () const override 957*6881a400Schristos { return TERNOP_COND; } 958*6881a400Schristos 959*6881a400Schristos protected: 960*6881a400Schristos 961*6881a400Schristos void do_generate_ax (struct expression *exp, 962*6881a400Schristos struct agent_expr *ax, 963*6881a400Schristos struct axs_value *value, 964*6881a400Schristos struct type *cast_type) 965*6881a400Schristos override; 966*6881a400Schristos }; 967*6881a400Schristos 968*6881a400Schristos class complex_operation 969*6881a400Schristos : public maybe_constant_operation<operation_up, operation_up, struct type *> 970*6881a400Schristos { 971*6881a400Schristos public: 972*6881a400Schristos 973*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 974*6881a400Schristos 975*6881a400Schristos value *evaluate (struct type *expect_type, 976*6881a400Schristos struct expression *exp, 977*6881a400Schristos enum noside noside) override 978*6881a400Schristos { 979*6881a400Schristos value *real = std::get<0> (m_storage)->evaluate (nullptr, exp, noside); 980*6881a400Schristos value *imag = std::get<1> (m_storage)->evaluate (nullptr, exp, noside); 981*6881a400Schristos return value_literal_complex (real, imag, 982*6881a400Schristos std::get<2> (m_storage)); 983*6881a400Schristos } 984*6881a400Schristos 985*6881a400Schristos enum exp_opcode opcode () const override 986*6881a400Schristos { return OP_COMPLEX; } 987*6881a400Schristos }; 988*6881a400Schristos 989*6881a400Schristos class structop_base_operation 990*6881a400Schristos : public tuple_holding_operation<operation_up, std::string> 991*6881a400Schristos { 992*6881a400Schristos public: 993*6881a400Schristos 994*6881a400Schristos /* Used for completion. Return the field name. */ 995*6881a400Schristos const std::string &get_string () const 996*6881a400Schristos { 997*6881a400Schristos return std::get<1> (m_storage); 998*6881a400Schristos } 999*6881a400Schristos 1000*6881a400Schristos value *evaluate_funcall (struct type *expect_type, 1001*6881a400Schristos struct expression *exp, 1002*6881a400Schristos enum noside noside, 1003*6881a400Schristos const std::vector<operation_up> &args) override; 1004*6881a400Schristos 1005*6881a400Schristos /* Try to complete this operation in the context of EXP. TRACKER is 1006*6881a400Schristos the completion tracker to update. Return true if completion was 1007*6881a400Schristos possible, false otherwise. */ 1008*6881a400Schristos virtual bool complete (struct expression *exp, completion_tracker &tracker) 1009*6881a400Schristos { 1010*6881a400Schristos return complete (exp, tracker, ""); 1011*6881a400Schristos } 1012*6881a400Schristos 1013*6881a400Schristos protected: 1014*6881a400Schristos 1015*6881a400Schristos /* Do the work of the public 'complete' method. PREFIX is prepended 1016*6881a400Schristos to each result. */ 1017*6881a400Schristos bool complete (struct expression *exp, completion_tracker &tracker, 1018*6881a400Schristos const char *prefix); 1019*6881a400Schristos 1020*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 1021*6881a400Schristos }; 1022*6881a400Schristos 1023*6881a400Schristos class structop_operation 1024*6881a400Schristos : public structop_base_operation 1025*6881a400Schristos { 1026*6881a400Schristos public: 1027*6881a400Schristos 1028*6881a400Schristos using structop_base_operation::structop_base_operation; 1029*6881a400Schristos 1030*6881a400Schristos value *evaluate (struct type *expect_type, 1031*6881a400Schristos struct expression *exp, 1032*6881a400Schristos enum noside noside) override 1033*6881a400Schristos { 1034*6881a400Schristos value *val =std::get<0> (m_storage)->evaluate (nullptr, exp, noside); 1035*6881a400Schristos return eval_op_structop_struct (expect_type, exp, noside, val, 1036*6881a400Schristos std::get<1> (m_storage).c_str ()); 1037*6881a400Schristos } 1038*6881a400Schristos 1039*6881a400Schristos enum exp_opcode opcode () const override 1040*6881a400Schristos { return STRUCTOP_STRUCT; } 1041*6881a400Schristos 1042*6881a400Schristos protected: 1043*6881a400Schristos 1044*6881a400Schristos void do_generate_ax (struct expression *exp, 1045*6881a400Schristos struct agent_expr *ax, 1046*6881a400Schristos struct axs_value *value, 1047*6881a400Schristos struct type *cast_type) 1048*6881a400Schristos override 1049*6881a400Schristos { 1050*6881a400Schristos gen_expr_structop (exp, STRUCTOP_STRUCT, 1051*6881a400Schristos std::get<0> (this->m_storage).get (), 1052*6881a400Schristos std::get<1> (this->m_storage).c_str (), 1053*6881a400Schristos ax, value); 1054*6881a400Schristos } 1055*6881a400Schristos }; 1056*6881a400Schristos 1057*6881a400Schristos class structop_ptr_operation 1058*6881a400Schristos : public structop_base_operation 1059*6881a400Schristos { 1060*6881a400Schristos public: 1061*6881a400Schristos 1062*6881a400Schristos using structop_base_operation::structop_base_operation; 1063*6881a400Schristos 1064*6881a400Schristos value *evaluate (struct type *expect_type, 1065*6881a400Schristos struct expression *exp, 1066*6881a400Schristos enum noside noside) override 1067*6881a400Schristos { 1068*6881a400Schristos value *val = std::get<0> (m_storage)->evaluate (nullptr, exp, noside); 1069*6881a400Schristos return eval_op_structop_ptr (expect_type, exp, noside, val, 1070*6881a400Schristos std::get<1> (m_storage).c_str ()); 1071*6881a400Schristos } 1072*6881a400Schristos 1073*6881a400Schristos enum exp_opcode opcode () const override 1074*6881a400Schristos { return STRUCTOP_PTR; } 1075*6881a400Schristos 1076*6881a400Schristos protected: 1077*6881a400Schristos 1078*6881a400Schristos void do_generate_ax (struct expression *exp, 1079*6881a400Schristos struct agent_expr *ax, 1080*6881a400Schristos struct axs_value *value, 1081*6881a400Schristos struct type *cast_type) 1082*6881a400Schristos override 1083*6881a400Schristos { 1084*6881a400Schristos gen_expr_structop (exp, STRUCTOP_PTR, 1085*6881a400Schristos std::get<0> (this->m_storage).get (), 1086*6881a400Schristos std::get<1> (this->m_storage).c_str (), 1087*6881a400Schristos ax, value); 1088*6881a400Schristos } 1089*6881a400Schristos }; 1090*6881a400Schristos 1091*6881a400Schristos class structop_member_base 1092*6881a400Schristos : public tuple_holding_operation<operation_up, operation_up> 1093*6881a400Schristos { 1094*6881a400Schristos public: 1095*6881a400Schristos 1096*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 1097*6881a400Schristos 1098*6881a400Schristos value *evaluate_funcall (struct type *expect_type, 1099*6881a400Schristos struct expression *exp, 1100*6881a400Schristos enum noside noside, 1101*6881a400Schristos const std::vector<operation_up> &args) override; 1102*6881a400Schristos }; 1103*6881a400Schristos 1104*6881a400Schristos class structop_member_operation 1105*6881a400Schristos : public structop_member_base 1106*6881a400Schristos { 1107*6881a400Schristos public: 1108*6881a400Schristos 1109*6881a400Schristos using structop_member_base::structop_member_base; 1110*6881a400Schristos 1111*6881a400Schristos value *evaluate (struct type *expect_type, 1112*6881a400Schristos struct expression *exp, 1113*6881a400Schristos enum noside noside) override 1114*6881a400Schristos { 1115*6881a400Schristos value *lhs 1116*6881a400Schristos = std::get<0> (m_storage)->evaluate_for_address (exp, noside); 1117*6881a400Schristos value *rhs 1118*6881a400Schristos = std::get<1> (m_storage)->evaluate (nullptr, exp, noside); 1119*6881a400Schristos return eval_op_member (expect_type, exp, noside, lhs, rhs); 1120*6881a400Schristos } 1121*6881a400Schristos 1122*6881a400Schristos enum exp_opcode opcode () const override 1123*6881a400Schristos { return STRUCTOP_MEMBER; } 1124*6881a400Schristos }; 1125*6881a400Schristos 1126*6881a400Schristos class structop_mptr_operation 1127*6881a400Schristos : public structop_member_base 1128*6881a400Schristos { 1129*6881a400Schristos public: 1130*6881a400Schristos 1131*6881a400Schristos using structop_member_base::structop_member_base; 1132*6881a400Schristos 1133*6881a400Schristos value *evaluate (struct type *expect_type, 1134*6881a400Schristos struct expression *exp, 1135*6881a400Schristos enum noside noside) override 1136*6881a400Schristos { 1137*6881a400Schristos value *lhs 1138*6881a400Schristos = std::get<0> (m_storage)->evaluate (nullptr, exp, noside); 1139*6881a400Schristos value *rhs 1140*6881a400Schristos = std::get<1> (m_storage)->evaluate (nullptr, exp, noside); 1141*6881a400Schristos return eval_op_member (expect_type, exp, noside, lhs, rhs); 1142*6881a400Schristos } 1143*6881a400Schristos 1144*6881a400Schristos enum exp_opcode opcode () const override 1145*6881a400Schristos { return STRUCTOP_MPTR; } 1146*6881a400Schristos }; 1147*6881a400Schristos 1148*6881a400Schristos class concat_operation 1149*6881a400Schristos : public maybe_constant_operation<operation_up, operation_up> 1150*6881a400Schristos { 1151*6881a400Schristos public: 1152*6881a400Schristos 1153*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 1154*6881a400Schristos 1155*6881a400Schristos value *evaluate (struct type *expect_type, 1156*6881a400Schristos struct expression *exp, 1157*6881a400Schristos enum noside noside) override 1158*6881a400Schristos { 1159*6881a400Schristos value *lhs 1160*6881a400Schristos = std::get<0> (m_storage)->evaluate_with_coercion (exp, noside); 1161*6881a400Schristos value *rhs 1162*6881a400Schristos = std::get<1> (m_storage)->evaluate_with_coercion (exp, noside); 1163*6881a400Schristos return value_concat (lhs, rhs); 1164*6881a400Schristos } 1165*6881a400Schristos 1166*6881a400Schristos enum exp_opcode opcode () const override 1167*6881a400Schristos { return BINOP_CONCAT; } 1168*6881a400Schristos }; 1169*6881a400Schristos 1170*6881a400Schristos class add_operation 1171*6881a400Schristos : public maybe_constant_operation<operation_up, operation_up> 1172*6881a400Schristos { 1173*6881a400Schristos public: 1174*6881a400Schristos 1175*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 1176*6881a400Schristos 1177*6881a400Schristos value *evaluate (struct type *expect_type, 1178*6881a400Schristos struct expression *exp, 1179*6881a400Schristos enum noside noside) override 1180*6881a400Schristos { 1181*6881a400Schristos value *lhs 1182*6881a400Schristos = std::get<0> (m_storage)->evaluate_with_coercion (exp, noside); 1183*6881a400Schristos value *rhs 1184*6881a400Schristos = std::get<1> (m_storage)->evaluate_with_coercion (exp, noside); 1185*6881a400Schristos return eval_op_add (expect_type, exp, noside, lhs, rhs); 1186*6881a400Schristos } 1187*6881a400Schristos 1188*6881a400Schristos enum exp_opcode opcode () const override 1189*6881a400Schristos { return BINOP_ADD; } 1190*6881a400Schristos 1191*6881a400Schristos protected: 1192*6881a400Schristos 1193*6881a400Schristos void do_generate_ax (struct expression *exp, 1194*6881a400Schristos struct agent_expr *ax, 1195*6881a400Schristos struct axs_value *value, 1196*6881a400Schristos struct type *cast_type) 1197*6881a400Schristos override 1198*6881a400Schristos { 1199*6881a400Schristos gen_expr_binop (exp, BINOP_ADD, 1200*6881a400Schristos std::get<0> (this->m_storage).get (), 1201*6881a400Schristos std::get<1> (this->m_storage).get (), 1202*6881a400Schristos ax, value); 1203*6881a400Schristos } 1204*6881a400Schristos }; 1205*6881a400Schristos 1206*6881a400Schristos class sub_operation 1207*6881a400Schristos : public maybe_constant_operation<operation_up, operation_up> 1208*6881a400Schristos { 1209*6881a400Schristos public: 1210*6881a400Schristos 1211*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 1212*6881a400Schristos 1213*6881a400Schristos value *evaluate (struct type *expect_type, 1214*6881a400Schristos struct expression *exp, 1215*6881a400Schristos enum noside noside) override 1216*6881a400Schristos { 1217*6881a400Schristos value *lhs 1218*6881a400Schristos = std::get<0> (m_storage)->evaluate_with_coercion (exp, noside); 1219*6881a400Schristos value *rhs 1220*6881a400Schristos = std::get<1> (m_storage)->evaluate_with_coercion (exp, noside); 1221*6881a400Schristos return eval_op_sub (expect_type, exp, noside, lhs, rhs); 1222*6881a400Schristos } 1223*6881a400Schristos 1224*6881a400Schristos enum exp_opcode opcode () const override 1225*6881a400Schristos { return BINOP_SUB; } 1226*6881a400Schristos 1227*6881a400Schristos protected: 1228*6881a400Schristos 1229*6881a400Schristos void do_generate_ax (struct expression *exp, 1230*6881a400Schristos struct agent_expr *ax, 1231*6881a400Schristos struct axs_value *value, 1232*6881a400Schristos struct type *cast_type) 1233*6881a400Schristos override 1234*6881a400Schristos { 1235*6881a400Schristos gen_expr_binop (exp, BINOP_SUB, 1236*6881a400Schristos std::get<0> (this->m_storage).get (), 1237*6881a400Schristos std::get<1> (this->m_storage).get (), 1238*6881a400Schristos ax, value); 1239*6881a400Schristos } 1240*6881a400Schristos }; 1241*6881a400Schristos 1242*6881a400Schristos typedef struct value *binary_ftype (struct type *expect_type, 1243*6881a400Schristos struct expression *exp, 1244*6881a400Schristos enum noside noside, enum exp_opcode op, 1245*6881a400Schristos struct value *arg1, struct value *arg2); 1246*6881a400Schristos 1247*6881a400Schristos template<enum exp_opcode OP, binary_ftype FUNC> 1248*6881a400Schristos class binop_operation 1249*6881a400Schristos : public maybe_constant_operation<operation_up, operation_up> 1250*6881a400Schristos { 1251*6881a400Schristos public: 1252*6881a400Schristos 1253*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 1254*6881a400Schristos 1255*6881a400Schristos value *evaluate (struct type *expect_type, 1256*6881a400Schristos struct expression *exp, 1257*6881a400Schristos enum noside noside) override 1258*6881a400Schristos { 1259*6881a400Schristos value *lhs 1260*6881a400Schristos = std::get<0> (m_storage)->evaluate (nullptr, exp, noside); 1261*6881a400Schristos value *rhs 1262*6881a400Schristos = std::get<1> (m_storage)->evaluate (nullptr, exp, noside); 1263*6881a400Schristos return FUNC (expect_type, exp, noside, OP, lhs, rhs); 1264*6881a400Schristos } 1265*6881a400Schristos 1266*6881a400Schristos enum exp_opcode opcode () const override 1267*6881a400Schristos { return OP; } 1268*6881a400Schristos }; 1269*6881a400Schristos 1270*6881a400Schristos template<enum exp_opcode OP, binary_ftype FUNC> 1271*6881a400Schristos class usual_ax_binop_operation 1272*6881a400Schristos : public binop_operation<OP, FUNC> 1273*6881a400Schristos { 1274*6881a400Schristos public: 1275*6881a400Schristos 1276*6881a400Schristos using binop_operation<OP, FUNC>::binop_operation; 1277*6881a400Schristos 1278*6881a400Schristos protected: 1279*6881a400Schristos 1280*6881a400Schristos void do_generate_ax (struct expression *exp, 1281*6881a400Schristos struct agent_expr *ax, 1282*6881a400Schristos struct axs_value *value, 1283*6881a400Schristos struct type *cast_type) 1284*6881a400Schristos override 1285*6881a400Schristos { 1286*6881a400Schristos gen_expr_binop (exp, OP, 1287*6881a400Schristos std::get<0> (this->m_storage).get (), 1288*6881a400Schristos std::get<1> (this->m_storage).get (), 1289*6881a400Schristos ax, value); 1290*6881a400Schristos } 1291*6881a400Schristos }; 1292*6881a400Schristos 1293*6881a400Schristos using exp_operation = binop_operation<BINOP_EXP, eval_op_binary>; 1294*6881a400Schristos using intdiv_operation = binop_operation<BINOP_INTDIV, eval_op_binary>; 1295*6881a400Schristos using mod_operation = binop_operation<BINOP_MOD, eval_op_binary>; 1296*6881a400Schristos 1297*6881a400Schristos using mul_operation = usual_ax_binop_operation<BINOP_MUL, eval_op_binary>; 1298*6881a400Schristos using div_operation = usual_ax_binop_operation<BINOP_DIV, eval_op_binary>; 1299*6881a400Schristos using rem_operation = usual_ax_binop_operation<BINOP_REM, eval_op_binary>; 1300*6881a400Schristos using lsh_operation = usual_ax_binop_operation<BINOP_LSH, eval_op_binary>; 1301*6881a400Schristos using rsh_operation = usual_ax_binop_operation<BINOP_RSH, eval_op_binary>; 1302*6881a400Schristos using bitwise_and_operation 1303*6881a400Schristos = usual_ax_binop_operation<BINOP_BITWISE_AND, eval_op_binary>; 1304*6881a400Schristos using bitwise_ior_operation 1305*6881a400Schristos = usual_ax_binop_operation<BINOP_BITWISE_IOR, eval_op_binary>; 1306*6881a400Schristos using bitwise_xor_operation 1307*6881a400Schristos = usual_ax_binop_operation<BINOP_BITWISE_XOR, eval_op_binary>; 1308*6881a400Schristos 1309*6881a400Schristos class subscript_operation 1310*6881a400Schristos : public usual_ax_binop_operation<BINOP_SUBSCRIPT, eval_op_subscript> 1311*6881a400Schristos { 1312*6881a400Schristos public: 1313*6881a400Schristos using usual_ax_binop_operation<BINOP_SUBSCRIPT, 1314*6881a400Schristos eval_op_subscript>::usual_ax_binop_operation; 1315*6881a400Schristos 1316*6881a400Schristos value *evaluate_for_sizeof (struct expression *exp, 1317*6881a400Schristos enum noside noside) override; 1318*6881a400Schristos }; 1319*6881a400Schristos 1320*6881a400Schristos /* Implementation of comparison operations. */ 1321*6881a400Schristos template<enum exp_opcode OP, binary_ftype FUNC> 1322*6881a400Schristos class comparison_operation 1323*6881a400Schristos : public usual_ax_binop_operation<OP, FUNC> 1324*6881a400Schristos { 1325*6881a400Schristos public: 1326*6881a400Schristos 1327*6881a400Schristos using usual_ax_binop_operation<OP, FUNC>::usual_ax_binop_operation; 1328*6881a400Schristos 1329*6881a400Schristos value *evaluate (struct type *expect_type, 1330*6881a400Schristos struct expression *exp, 1331*6881a400Schristos enum noside noside) override 1332*6881a400Schristos { 1333*6881a400Schristos value *lhs 1334*6881a400Schristos = std::get<0> (this->m_storage)->evaluate (nullptr, exp, noside); 1335*6881a400Schristos value *rhs 1336*6881a400Schristos = std::get<1> (this->m_storage)->evaluate (value_type (lhs), exp, 1337*6881a400Schristos noside); 1338*6881a400Schristos return FUNC (expect_type, exp, noside, OP, lhs, rhs); 1339*6881a400Schristos } 1340*6881a400Schristos }; 1341*6881a400Schristos 1342*6881a400Schristos class equal_operation 1343*6881a400Schristos : public comparison_operation<BINOP_EQUAL, eval_op_equal> 1344*6881a400Schristos { 1345*6881a400Schristos public: 1346*6881a400Schristos 1347*6881a400Schristos using comparison_operation::comparison_operation; 1348*6881a400Schristos 1349*6881a400Schristos operation *get_lhs () const 1350*6881a400Schristos { 1351*6881a400Schristos return std::get<0> (m_storage).get (); 1352*6881a400Schristos } 1353*6881a400Schristos 1354*6881a400Schristos operation *get_rhs () const 1355*6881a400Schristos { 1356*6881a400Schristos return std::get<1> (m_storage).get (); 1357*6881a400Schristos } 1358*6881a400Schristos }; 1359*6881a400Schristos 1360*6881a400Schristos using notequal_operation 1361*6881a400Schristos = comparison_operation<BINOP_NOTEQUAL, eval_op_notequal>; 1362*6881a400Schristos using less_operation = comparison_operation<BINOP_LESS, eval_op_less>; 1363*6881a400Schristos using gtr_operation = comparison_operation<BINOP_GTR, eval_op_gtr>; 1364*6881a400Schristos using geq_operation = comparison_operation<BINOP_GEQ, eval_op_geq>; 1365*6881a400Schristos using leq_operation = comparison_operation<BINOP_LEQ, eval_op_leq>; 1366*6881a400Schristos 1367*6881a400Schristos /* Implement the GDB '@' repeat operator. */ 1368*6881a400Schristos class repeat_operation 1369*6881a400Schristos : public binop_operation<BINOP_REPEAT, eval_op_repeat> 1370*6881a400Schristos { 1371*6881a400Schristos using binop_operation<BINOP_REPEAT, eval_op_repeat>::binop_operation; 1372*6881a400Schristos 1373*6881a400Schristos protected: 1374*6881a400Schristos 1375*6881a400Schristos void do_generate_ax (struct expression *exp, 1376*6881a400Schristos struct agent_expr *ax, 1377*6881a400Schristos struct axs_value *value, 1378*6881a400Schristos struct type *cast_type) 1379*6881a400Schristos override; 1380*6881a400Schristos }; 1381*6881a400Schristos 1382*6881a400Schristos /* C-style comma operator. */ 1383*6881a400Schristos class comma_operation 1384*6881a400Schristos : public maybe_constant_operation<operation_up, operation_up> 1385*6881a400Schristos { 1386*6881a400Schristos public: 1387*6881a400Schristos 1388*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 1389*6881a400Schristos 1390*6881a400Schristos value *evaluate (struct type *expect_type, 1391*6881a400Schristos struct expression *exp, 1392*6881a400Schristos enum noside noside) override 1393*6881a400Schristos { 1394*6881a400Schristos /* The left-hand-side is only evaluated for side effects, so don't 1395*6881a400Schristos bother in other modes. */ 1396*6881a400Schristos if (noside == EVAL_NORMAL) 1397*6881a400Schristos std::get<0> (m_storage)->evaluate (nullptr, exp, noside); 1398*6881a400Schristos return std::get<1> (m_storage)->evaluate (nullptr, exp, noside); 1399*6881a400Schristos } 1400*6881a400Schristos 1401*6881a400Schristos enum exp_opcode opcode () const override 1402*6881a400Schristos { return BINOP_COMMA; } 1403*6881a400Schristos 1404*6881a400Schristos protected: 1405*6881a400Schristos 1406*6881a400Schristos void do_generate_ax (struct expression *exp, 1407*6881a400Schristos struct agent_expr *ax, 1408*6881a400Schristos struct axs_value *value, 1409*6881a400Schristos struct type *cast_type) 1410*6881a400Schristos override; 1411*6881a400Schristos }; 1412*6881a400Schristos 1413*6881a400Schristos typedef struct value *unary_ftype (struct type *expect_type, 1414*6881a400Schristos struct expression *exp, 1415*6881a400Schristos enum noside noside, enum exp_opcode op, 1416*6881a400Schristos struct value *arg1); 1417*6881a400Schristos 1418*6881a400Schristos /* Base class for unary operations. */ 1419*6881a400Schristos template<enum exp_opcode OP, unary_ftype FUNC> 1420*6881a400Schristos class unop_operation 1421*6881a400Schristos : public maybe_constant_operation<operation_up> 1422*6881a400Schristos { 1423*6881a400Schristos public: 1424*6881a400Schristos 1425*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 1426*6881a400Schristos 1427*6881a400Schristos value *evaluate (struct type *expect_type, 1428*6881a400Schristos struct expression *exp, 1429*6881a400Schristos enum noside noside) override 1430*6881a400Schristos { 1431*6881a400Schristos value *val = std::get<0> (m_storage)->evaluate (nullptr, exp, noside); 1432*6881a400Schristos return FUNC (expect_type, exp, noside, OP, val); 1433*6881a400Schristos } 1434*6881a400Schristos 1435*6881a400Schristos enum exp_opcode opcode () const override 1436*6881a400Schristos { return OP; } 1437*6881a400Schristos }; 1438*6881a400Schristos 1439*6881a400Schristos /* Unary operations that can also be turned into agent expressions in 1440*6881a400Schristos the "usual" way. */ 1441*6881a400Schristos template<enum exp_opcode OP, unary_ftype FUNC> 1442*6881a400Schristos class usual_ax_unop_operation 1443*6881a400Schristos : public unop_operation<OP, FUNC> 1444*6881a400Schristos { 1445*6881a400Schristos using unop_operation<OP, FUNC>::unop_operation; 1446*6881a400Schristos 1447*6881a400Schristos protected: 1448*6881a400Schristos 1449*6881a400Schristos void do_generate_ax (struct expression *exp, 1450*6881a400Schristos struct agent_expr *ax, 1451*6881a400Schristos struct axs_value *value, 1452*6881a400Schristos struct type *cast_type) 1453*6881a400Schristos override 1454*6881a400Schristos { 1455*6881a400Schristos gen_expr_unop (exp, OP, 1456*6881a400Schristos std::get<0> (this->m_storage).get (), 1457*6881a400Schristos ax, value); 1458*6881a400Schristos } 1459*6881a400Schristos }; 1460*6881a400Schristos 1461*6881a400Schristos using unary_plus_operation = usual_ax_unop_operation<UNOP_PLUS, eval_op_plus>; 1462*6881a400Schristos using unary_neg_operation = usual_ax_unop_operation<UNOP_NEG, eval_op_neg>; 1463*6881a400Schristos using unary_complement_operation 1464*6881a400Schristos = usual_ax_unop_operation<UNOP_COMPLEMENT, eval_op_complement>; 1465*6881a400Schristos using unary_logical_not_operation 1466*6881a400Schristos = usual_ax_unop_operation<UNOP_LOGICAL_NOT, eval_op_lognot>; 1467*6881a400Schristos 1468*6881a400Schristos /* Handle pre- and post- increment and -decrement. */ 1469*6881a400Schristos template<enum exp_opcode OP, unary_ftype FUNC> 1470*6881a400Schristos class unop_incr_operation 1471*6881a400Schristos : public tuple_holding_operation<operation_up> 1472*6881a400Schristos { 1473*6881a400Schristos public: 1474*6881a400Schristos 1475*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 1476*6881a400Schristos 1477*6881a400Schristos value *evaluate (struct type *expect_type, 1478*6881a400Schristos struct expression *exp, 1479*6881a400Schristos enum noside noside) override 1480*6881a400Schristos { 1481*6881a400Schristos value *val = std::get<0> (m_storage)->evaluate (expect_type, exp, noside); 1482*6881a400Schristos return FUNC (expect_type, exp, noside, OP, val); 1483*6881a400Schristos } 1484*6881a400Schristos 1485*6881a400Schristos enum exp_opcode opcode () const override 1486*6881a400Schristos { return OP; } 1487*6881a400Schristos }; 1488*6881a400Schristos 1489*6881a400Schristos using preinc_operation 1490*6881a400Schristos = unop_incr_operation<UNOP_PREINCREMENT, eval_op_preinc>; 1491*6881a400Schristos using predec_operation 1492*6881a400Schristos = unop_incr_operation<UNOP_PREDECREMENT, eval_op_predec>; 1493*6881a400Schristos using postinc_operation 1494*6881a400Schristos = unop_incr_operation<UNOP_POSTINCREMENT, eval_op_postinc>; 1495*6881a400Schristos using postdec_operation 1496*6881a400Schristos = unop_incr_operation<UNOP_POSTDECREMENT, eval_op_postdec>; 1497*6881a400Schristos 1498*6881a400Schristos /* Base class for implementations of UNOP_IND. */ 1499*6881a400Schristos class unop_ind_base_operation 1500*6881a400Schristos : public tuple_holding_operation<operation_up> 1501*6881a400Schristos { 1502*6881a400Schristos public: 1503*6881a400Schristos 1504*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 1505*6881a400Schristos 1506*6881a400Schristos value *evaluate (struct type *expect_type, 1507*6881a400Schristos struct expression *exp, 1508*6881a400Schristos enum noside noside) override 1509*6881a400Schristos { 1510*6881a400Schristos if (expect_type != nullptr && expect_type->code () == TYPE_CODE_PTR) 1511*6881a400Schristos expect_type = check_typedef (expect_type)->target_type (); 1512*6881a400Schristos value *val = std::get<0> (m_storage)->evaluate (expect_type, exp, noside); 1513*6881a400Schristos return eval_op_ind (expect_type, exp, noside, val); 1514*6881a400Schristos } 1515*6881a400Schristos 1516*6881a400Schristos value *evaluate_for_address (struct expression *exp, 1517*6881a400Schristos enum noside noside) override; 1518*6881a400Schristos 1519*6881a400Schristos value *evaluate_for_sizeof (struct expression *exp, 1520*6881a400Schristos enum noside noside) override; 1521*6881a400Schristos 1522*6881a400Schristos enum exp_opcode opcode () const override 1523*6881a400Schristos { return UNOP_IND; } 1524*6881a400Schristos }; 1525*6881a400Schristos 1526*6881a400Schristos /* Ordinary UNOP_IND implementation. */ 1527*6881a400Schristos class unop_ind_operation 1528*6881a400Schristos : public unop_ind_base_operation 1529*6881a400Schristos { 1530*6881a400Schristos public: 1531*6881a400Schristos 1532*6881a400Schristos using unop_ind_base_operation::unop_ind_base_operation; 1533*6881a400Schristos 1534*6881a400Schristos protected: 1535*6881a400Schristos 1536*6881a400Schristos void do_generate_ax (struct expression *exp, 1537*6881a400Schristos struct agent_expr *ax, 1538*6881a400Schristos struct axs_value *value, 1539*6881a400Schristos struct type *cast_type) 1540*6881a400Schristos override 1541*6881a400Schristos { 1542*6881a400Schristos gen_expr_unop (exp, UNOP_IND, 1543*6881a400Schristos std::get<0> (this->m_storage).get (), 1544*6881a400Schristos ax, value); 1545*6881a400Schristos } 1546*6881a400Schristos }; 1547*6881a400Schristos 1548*6881a400Schristos /* Implement OP_TYPE. */ 1549*6881a400Schristos class type_operation 1550*6881a400Schristos : public tuple_holding_operation<struct type *> 1551*6881a400Schristos { 1552*6881a400Schristos public: 1553*6881a400Schristos 1554*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 1555*6881a400Schristos 1556*6881a400Schristos value *evaluate (struct type *expect_type, 1557*6881a400Schristos struct expression *exp, 1558*6881a400Schristos enum noside noside) override 1559*6881a400Schristos { 1560*6881a400Schristos return eval_op_type (expect_type, exp, noside, std::get<0> (m_storage)); 1561*6881a400Schristos } 1562*6881a400Schristos 1563*6881a400Schristos enum exp_opcode opcode () const override 1564*6881a400Schristos { return OP_TYPE; } 1565*6881a400Schristos 1566*6881a400Schristos bool constant_p () const override 1567*6881a400Schristos { return true; } 1568*6881a400Schristos }; 1569*6881a400Schristos 1570*6881a400Schristos /* Implement the "typeof" operation. */ 1571*6881a400Schristos class typeof_operation 1572*6881a400Schristos : public maybe_constant_operation<operation_up> 1573*6881a400Schristos { 1574*6881a400Schristos public: 1575*6881a400Schristos 1576*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 1577*6881a400Schristos 1578*6881a400Schristos value *evaluate (struct type *expect_type, 1579*6881a400Schristos struct expression *exp, 1580*6881a400Schristos enum noside noside) override 1581*6881a400Schristos { 1582*6881a400Schristos if (noside == EVAL_AVOID_SIDE_EFFECTS) 1583*6881a400Schristos return std::get<0> (m_storage)->evaluate (nullptr, exp, 1584*6881a400Schristos EVAL_AVOID_SIDE_EFFECTS); 1585*6881a400Schristos else 1586*6881a400Schristos error (_("Attempt to use a type as an expression")); 1587*6881a400Schristos } 1588*6881a400Schristos 1589*6881a400Schristos enum exp_opcode opcode () const override 1590*6881a400Schristos { return OP_TYPEOF; } 1591*6881a400Schristos }; 1592*6881a400Schristos 1593*6881a400Schristos /* Implement 'decltype'. */ 1594*6881a400Schristos class decltype_operation 1595*6881a400Schristos : public maybe_constant_operation<operation_up> 1596*6881a400Schristos { 1597*6881a400Schristos public: 1598*6881a400Schristos 1599*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 1600*6881a400Schristos 1601*6881a400Schristos value *evaluate (struct type *expect_type, 1602*6881a400Schristos struct expression *exp, 1603*6881a400Schristos enum noside noside) override 1604*6881a400Schristos { 1605*6881a400Schristos if (noside == EVAL_AVOID_SIDE_EFFECTS) 1606*6881a400Schristos { 1607*6881a400Schristos value *result 1608*6881a400Schristos = std::get<0> (m_storage)->evaluate (nullptr, exp, 1609*6881a400Schristos EVAL_AVOID_SIDE_EFFECTS); 1610*6881a400Schristos enum exp_opcode sub_op = std::get<0> (m_storage)->opcode (); 1611*6881a400Schristos if (sub_op == BINOP_SUBSCRIPT 1612*6881a400Schristos || sub_op == STRUCTOP_MEMBER 1613*6881a400Schristos || sub_op == STRUCTOP_MPTR 1614*6881a400Schristos || sub_op == UNOP_IND 1615*6881a400Schristos || sub_op == STRUCTOP_STRUCT 1616*6881a400Schristos || sub_op == STRUCTOP_PTR 1617*6881a400Schristos || sub_op == OP_SCOPE) 1618*6881a400Schristos { 1619*6881a400Schristos struct type *type = value_type (result); 1620*6881a400Schristos 1621*6881a400Schristos if (!TYPE_IS_REFERENCE (type)) 1622*6881a400Schristos { 1623*6881a400Schristos type = lookup_lvalue_reference_type (type); 1624*6881a400Schristos result = allocate_value (type); 1625*6881a400Schristos } 1626*6881a400Schristos } 1627*6881a400Schristos 1628*6881a400Schristos return result; 1629*6881a400Schristos } 1630*6881a400Schristos else 1631*6881a400Schristos error (_("Attempt to use a type as an expression")); 1632*6881a400Schristos } 1633*6881a400Schristos 1634*6881a400Schristos enum exp_opcode opcode () const override 1635*6881a400Schristos { return OP_DECLTYPE; } 1636*6881a400Schristos }; 1637*6881a400Schristos 1638*6881a400Schristos /* Implement 'typeid'. */ 1639*6881a400Schristos class typeid_operation 1640*6881a400Schristos : public tuple_holding_operation<operation_up> 1641*6881a400Schristos { 1642*6881a400Schristos public: 1643*6881a400Schristos 1644*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 1645*6881a400Schristos 1646*6881a400Schristos value *evaluate (struct type *expect_type, 1647*6881a400Schristos struct expression *exp, 1648*6881a400Schristos enum noside noside) override 1649*6881a400Schristos { 1650*6881a400Schristos enum exp_opcode sub_op = std::get<0> (m_storage)->opcode (); 1651*6881a400Schristos enum noside sub_noside 1652*6881a400Schristos = ((sub_op == OP_TYPE || sub_op == OP_DECLTYPE || sub_op == OP_TYPEOF) 1653*6881a400Schristos ? EVAL_AVOID_SIDE_EFFECTS 1654*6881a400Schristos : noside); 1655*6881a400Schristos 1656*6881a400Schristos value *result = std::get<0> (m_storage)->evaluate (nullptr, exp, 1657*6881a400Schristos sub_noside); 1658*6881a400Schristos if (noside != EVAL_NORMAL) 1659*6881a400Schristos return allocate_value (cplus_typeid_type (exp->gdbarch)); 1660*6881a400Schristos return cplus_typeid (result); 1661*6881a400Schristos } 1662*6881a400Schristos 1663*6881a400Schristos enum exp_opcode opcode () const override 1664*6881a400Schristos { return OP_TYPEID; } 1665*6881a400Schristos }; 1666*6881a400Schristos 1667*6881a400Schristos /* Implement the address-of operation. */ 1668*6881a400Schristos class unop_addr_operation 1669*6881a400Schristos : public maybe_constant_operation<operation_up> 1670*6881a400Schristos { 1671*6881a400Schristos public: 1672*6881a400Schristos 1673*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 1674*6881a400Schristos 1675*6881a400Schristos value *evaluate (struct type *expect_type, 1676*6881a400Schristos struct expression *exp, 1677*6881a400Schristos enum noside noside) override 1678*6881a400Schristos { 1679*6881a400Schristos /* C++: check for and handle pointer to members. */ 1680*6881a400Schristos return std::get<0> (m_storage)->evaluate_for_address (exp, noside); 1681*6881a400Schristos } 1682*6881a400Schristos 1683*6881a400Schristos enum exp_opcode opcode () const override 1684*6881a400Schristos { return UNOP_ADDR; } 1685*6881a400Schristos 1686*6881a400Schristos /* Return the subexpression. */ 1687*6881a400Schristos const operation_up &get_expression () const 1688*6881a400Schristos { 1689*6881a400Schristos return std::get<0> (m_storage); 1690*6881a400Schristos } 1691*6881a400Schristos 1692*6881a400Schristos protected: 1693*6881a400Schristos 1694*6881a400Schristos void do_generate_ax (struct expression *exp, 1695*6881a400Schristos struct agent_expr *ax, 1696*6881a400Schristos struct axs_value *value, 1697*6881a400Schristos struct type *cast_type) 1698*6881a400Schristos override 1699*6881a400Schristos { 1700*6881a400Schristos gen_expr_unop (exp, UNOP_ADDR, 1701*6881a400Schristos std::get<0> (this->m_storage).get (), 1702*6881a400Schristos ax, value); 1703*6881a400Schristos } 1704*6881a400Schristos }; 1705*6881a400Schristos 1706*6881a400Schristos /* Implement 'sizeof'. */ 1707*6881a400Schristos class unop_sizeof_operation 1708*6881a400Schristos : public maybe_constant_operation<operation_up> 1709*6881a400Schristos { 1710*6881a400Schristos public: 1711*6881a400Schristos 1712*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 1713*6881a400Schristos 1714*6881a400Schristos value *evaluate (struct type *expect_type, 1715*6881a400Schristos struct expression *exp, 1716*6881a400Schristos enum noside noside) override 1717*6881a400Schristos { 1718*6881a400Schristos return std::get<0> (m_storage)->evaluate_for_sizeof (exp, noside); 1719*6881a400Schristos } 1720*6881a400Schristos 1721*6881a400Schristos enum exp_opcode opcode () const override 1722*6881a400Schristos { return UNOP_SIZEOF; } 1723*6881a400Schristos 1724*6881a400Schristos protected: 1725*6881a400Schristos 1726*6881a400Schristos void do_generate_ax (struct expression *exp, 1727*6881a400Schristos struct agent_expr *ax, 1728*6881a400Schristos struct axs_value *value, 1729*6881a400Schristos struct type *cast_type) 1730*6881a400Schristos override; 1731*6881a400Schristos }; 1732*6881a400Schristos 1733*6881a400Schristos /* Implement 'alignof'. */ 1734*6881a400Schristos class unop_alignof_operation 1735*6881a400Schristos : public maybe_constant_operation<operation_up> 1736*6881a400Schristos { 1737*6881a400Schristos public: 1738*6881a400Schristos 1739*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 1740*6881a400Schristos 1741*6881a400Schristos value *evaluate (struct type *expect_type, 1742*6881a400Schristos struct expression *exp, 1743*6881a400Schristos enum noside noside) override 1744*6881a400Schristos { 1745*6881a400Schristos value *val = std::get<0> (m_storage)->evaluate (nullptr, exp, 1746*6881a400Schristos EVAL_AVOID_SIDE_EFFECTS); 1747*6881a400Schristos return eval_op_alignof (expect_type, exp, noside, val); 1748*6881a400Schristos } 1749*6881a400Schristos 1750*6881a400Schristos enum exp_opcode opcode () const override 1751*6881a400Schristos { return UNOP_ALIGNOF; } 1752*6881a400Schristos }; 1753*6881a400Schristos 1754*6881a400Schristos /* Implement UNOP_MEMVAL. */ 1755*6881a400Schristos class unop_memval_operation 1756*6881a400Schristos : public tuple_holding_operation<operation_up, struct type *> 1757*6881a400Schristos { 1758*6881a400Schristos public: 1759*6881a400Schristos 1760*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 1761*6881a400Schristos 1762*6881a400Schristos value *evaluate (struct type *expect_type, 1763*6881a400Schristos struct expression *exp, 1764*6881a400Schristos enum noside noside) override 1765*6881a400Schristos { 1766*6881a400Schristos value *val = std::get<0> (m_storage)->evaluate (expect_type, exp, noside); 1767*6881a400Schristos return eval_op_memval (expect_type, exp, noside, val, 1768*6881a400Schristos std::get<1> (m_storage)); 1769*6881a400Schristos } 1770*6881a400Schristos 1771*6881a400Schristos value *evaluate_for_sizeof (struct expression *exp, 1772*6881a400Schristos enum noside noside) override; 1773*6881a400Schristos 1774*6881a400Schristos value *evaluate_for_address (struct expression *exp, 1775*6881a400Schristos enum noside noside) override; 1776*6881a400Schristos 1777*6881a400Schristos enum exp_opcode opcode () const override 1778*6881a400Schristos { return UNOP_MEMVAL; } 1779*6881a400Schristos 1780*6881a400Schristos /* Return the type referenced by this object. */ 1781*6881a400Schristos struct type *get_type () const 1782*6881a400Schristos { 1783*6881a400Schristos return std::get<1> (m_storage); 1784*6881a400Schristos } 1785*6881a400Schristos 1786*6881a400Schristos protected: 1787*6881a400Schristos 1788*6881a400Schristos void do_generate_ax (struct expression *exp, 1789*6881a400Schristos struct agent_expr *ax, 1790*6881a400Schristos struct axs_value *value, 1791*6881a400Schristos struct type *cast_type) 1792*6881a400Schristos override; 1793*6881a400Schristos }; 1794*6881a400Schristos 1795*6881a400Schristos /* Implement UNOP_MEMVAL_TYPE. */ 1796*6881a400Schristos class unop_memval_type_operation 1797*6881a400Schristos : public tuple_holding_operation<operation_up, operation_up> 1798*6881a400Schristos { 1799*6881a400Schristos public: 1800*6881a400Schristos 1801*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 1802*6881a400Schristos 1803*6881a400Schristos value *evaluate (struct type *expect_type, 1804*6881a400Schristos struct expression *exp, 1805*6881a400Schristos enum noside noside) override 1806*6881a400Schristos { 1807*6881a400Schristos value *typeval 1808*6881a400Schristos = std::get<0> (m_storage)->evaluate (expect_type, exp, 1809*6881a400Schristos EVAL_AVOID_SIDE_EFFECTS); 1810*6881a400Schristos struct type *type = value_type (typeval); 1811*6881a400Schristos value *val = std::get<1> (m_storage)->evaluate (expect_type, exp, noside); 1812*6881a400Schristos return eval_op_memval (expect_type, exp, noside, val, type); 1813*6881a400Schristos } 1814*6881a400Schristos 1815*6881a400Schristos value *evaluate_for_sizeof (struct expression *exp, 1816*6881a400Schristos enum noside noside) override; 1817*6881a400Schristos 1818*6881a400Schristos value *evaluate_for_address (struct expression *exp, 1819*6881a400Schristos enum noside noside) override; 1820*6881a400Schristos 1821*6881a400Schristos enum exp_opcode opcode () const override 1822*6881a400Schristos { return UNOP_MEMVAL_TYPE; } 1823*6881a400Schristos 1824*6881a400Schristos protected: 1825*6881a400Schristos 1826*6881a400Schristos void do_generate_ax (struct expression *exp, 1827*6881a400Schristos struct agent_expr *ax, 1828*6881a400Schristos struct axs_value *value, 1829*6881a400Schristos struct type *cast_type) 1830*6881a400Schristos override; 1831*6881a400Schristos }; 1832*6881a400Schristos 1833*6881a400Schristos /* Implement the 'this' expression. */ 1834*6881a400Schristos class op_this_operation 1835*6881a400Schristos : public tuple_holding_operation<> 1836*6881a400Schristos { 1837*6881a400Schristos public: 1838*6881a400Schristos 1839*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 1840*6881a400Schristos 1841*6881a400Schristos value *evaluate (struct type *expect_type, 1842*6881a400Schristos struct expression *exp, 1843*6881a400Schristos enum noside noside) override 1844*6881a400Schristos { 1845*6881a400Schristos return value_of_this (exp->language_defn); 1846*6881a400Schristos } 1847*6881a400Schristos 1848*6881a400Schristos enum exp_opcode opcode () const override 1849*6881a400Schristos { return OP_THIS; } 1850*6881a400Schristos 1851*6881a400Schristos protected: 1852*6881a400Schristos 1853*6881a400Schristos void do_generate_ax (struct expression *exp, 1854*6881a400Schristos struct agent_expr *ax, 1855*6881a400Schristos struct axs_value *value, 1856*6881a400Schristos struct type *cast_type) 1857*6881a400Schristos override; 1858*6881a400Schristos }; 1859*6881a400Schristos 1860*6881a400Schristos /* Implement the "type instance" operation. */ 1861*6881a400Schristos class type_instance_operation 1862*6881a400Schristos : public tuple_holding_operation<type_instance_flags, std::vector<type *>, 1863*6881a400Schristos operation_up> 1864*6881a400Schristos { 1865*6881a400Schristos public: 1866*6881a400Schristos 1867*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 1868*6881a400Schristos 1869*6881a400Schristos value *evaluate (struct type *expect_type, 1870*6881a400Schristos struct expression *exp, 1871*6881a400Schristos enum noside noside) override; 1872*6881a400Schristos 1873*6881a400Schristos enum exp_opcode opcode () const override 1874*6881a400Schristos { return TYPE_INSTANCE; } 1875*6881a400Schristos }; 1876*6881a400Schristos 1877*6881a400Schristos /* The assignment operator. */ 1878*6881a400Schristos class assign_operation 1879*6881a400Schristos : public tuple_holding_operation<operation_up, operation_up> 1880*6881a400Schristos { 1881*6881a400Schristos public: 1882*6881a400Schristos 1883*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 1884*6881a400Schristos 1885*6881a400Schristos value *evaluate (struct type *expect_type, 1886*6881a400Schristos struct expression *exp, 1887*6881a400Schristos enum noside noside) override 1888*6881a400Schristos { 1889*6881a400Schristos value *lhs = std::get<0> (m_storage)->evaluate (nullptr, exp, noside); 1890*6881a400Schristos /* Special-case assignments where the left-hand-side is a 1891*6881a400Schristos convenience variable -- in these, don't bother setting an 1892*6881a400Schristos expected type. This avoids a weird case where re-assigning a 1893*6881a400Schristos string or array to an internal variable could error with "Too 1894*6881a400Schristos many array elements". */ 1895*6881a400Schristos struct type *xtype = (VALUE_LVAL (lhs) == lval_internalvar 1896*6881a400Schristos ? nullptr 1897*6881a400Schristos : value_type (lhs)); 1898*6881a400Schristos value *rhs = std::get<1> (m_storage)->evaluate (xtype, exp, noside); 1899*6881a400Schristos 1900*6881a400Schristos if (noside == EVAL_AVOID_SIDE_EFFECTS) 1901*6881a400Schristos return lhs; 1902*6881a400Schristos if (binop_user_defined_p (BINOP_ASSIGN, lhs, rhs)) 1903*6881a400Schristos return value_x_binop (lhs, rhs, BINOP_ASSIGN, OP_NULL, noside); 1904*6881a400Schristos else 1905*6881a400Schristos return value_assign (lhs, rhs); 1906*6881a400Schristos } 1907*6881a400Schristos 1908*6881a400Schristos enum exp_opcode opcode () const override 1909*6881a400Schristos { return BINOP_ASSIGN; } 1910*6881a400Schristos 1911*6881a400Schristos /* Return the left-hand-side of the assignment. */ 1912*6881a400Schristos operation *get_lhs () const 1913*6881a400Schristos { 1914*6881a400Schristos return std::get<0> (m_storage).get (); 1915*6881a400Schristos } 1916*6881a400Schristos 1917*6881a400Schristos protected: 1918*6881a400Schristos 1919*6881a400Schristos void do_generate_ax (struct expression *exp, 1920*6881a400Schristos struct agent_expr *ax, 1921*6881a400Schristos struct axs_value *value, 1922*6881a400Schristos struct type *cast_type) 1923*6881a400Schristos override; 1924*6881a400Schristos }; 1925*6881a400Schristos 1926*6881a400Schristos /* Assignment with modification, like "+=". */ 1927*6881a400Schristos class assign_modify_operation 1928*6881a400Schristos : public tuple_holding_operation<exp_opcode, operation_up, operation_up> 1929*6881a400Schristos { 1930*6881a400Schristos public: 1931*6881a400Schristos 1932*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 1933*6881a400Schristos 1934*6881a400Schristos value *evaluate (struct type *expect_type, 1935*6881a400Schristos struct expression *exp, 1936*6881a400Schristos enum noside noside) override 1937*6881a400Schristos { 1938*6881a400Schristos value *lhs = std::get<1> (m_storage)->evaluate (nullptr, exp, noside); 1939*6881a400Schristos value *rhs = std::get<2> (m_storage)->evaluate (expect_type, exp, noside); 1940*6881a400Schristos return eval_binop_assign_modify (expect_type, exp, noside, 1941*6881a400Schristos std::get<0> (m_storage), lhs, rhs); 1942*6881a400Schristos } 1943*6881a400Schristos 1944*6881a400Schristos enum exp_opcode opcode () const override 1945*6881a400Schristos { return BINOP_ASSIGN_MODIFY; } 1946*6881a400Schristos 1947*6881a400Schristos protected: 1948*6881a400Schristos 1949*6881a400Schristos void do_generate_ax (struct expression *exp, 1950*6881a400Schristos struct agent_expr *ax, 1951*6881a400Schristos struct axs_value *value, 1952*6881a400Schristos struct type *cast_type) 1953*6881a400Schristos override; 1954*6881a400Schristos }; 1955*6881a400Schristos 1956*6881a400Schristos /* Not a cast! Extract a value of a given type from the contents of a 1957*6881a400Schristos value. The new value is extracted from the least significant bytes 1958*6881a400Schristos of the old value. The new value's type must be no bigger than the 1959*6881a400Schristos old values type. */ 1960*6881a400Schristos class unop_extract_operation 1961*6881a400Schristos : public maybe_constant_operation<operation_up, struct type *> 1962*6881a400Schristos { 1963*6881a400Schristos public: 1964*6881a400Schristos 1965*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 1966*6881a400Schristos 1967*6881a400Schristos value *evaluate (struct type *expect_type, struct expression *exp, 1968*6881a400Schristos enum noside noside) override; 1969*6881a400Schristos 1970*6881a400Schristos enum exp_opcode opcode () const override 1971*6881a400Schristos { return UNOP_EXTRACT; } 1972*6881a400Schristos 1973*6881a400Schristos /* Return the type referenced by this object. */ 1974*6881a400Schristos struct type *get_type () const 1975*6881a400Schristos { 1976*6881a400Schristos return std::get<1> (m_storage); 1977*6881a400Schristos } 1978*6881a400Schristos 1979*6881a400Schristos protected: 1980*6881a400Schristos 1981*6881a400Schristos void do_generate_ax (struct expression *exp, 1982*6881a400Schristos struct agent_expr *ax, 1983*6881a400Schristos struct axs_value *value, 1984*6881a400Schristos struct type *cast_type) override; 1985*6881a400Schristos }; 1986*6881a400Schristos 1987*6881a400Schristos /* A type cast. */ 1988*6881a400Schristos class unop_cast_operation 1989*6881a400Schristos : public maybe_constant_operation<operation_up, struct type *> 1990*6881a400Schristos { 1991*6881a400Schristos public: 1992*6881a400Schristos 1993*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 1994*6881a400Schristos 1995*6881a400Schristos value *evaluate (struct type *expect_type, 1996*6881a400Schristos struct expression *exp, 1997*6881a400Schristos enum noside noside) override 1998*6881a400Schristos { 1999*6881a400Schristos return std::get<0> (m_storage)->evaluate_for_cast (std::get<1> (m_storage), 2000*6881a400Schristos exp, noside); 2001*6881a400Schristos } 2002*6881a400Schristos 2003*6881a400Schristos enum exp_opcode opcode () const override 2004*6881a400Schristos { return UNOP_CAST; } 2005*6881a400Schristos 2006*6881a400Schristos /* Return the type referenced by this object. */ 2007*6881a400Schristos struct type *get_type () const 2008*6881a400Schristos { 2009*6881a400Schristos return std::get<1> (m_storage); 2010*6881a400Schristos } 2011*6881a400Schristos 2012*6881a400Schristos protected: 2013*6881a400Schristos 2014*6881a400Schristos void do_generate_ax (struct expression *exp, 2015*6881a400Schristos struct agent_expr *ax, 2016*6881a400Schristos struct axs_value *value, 2017*6881a400Schristos struct type *cast_type) 2018*6881a400Schristos override; 2019*6881a400Schristos }; 2020*6881a400Schristos 2021*6881a400Schristos /* A cast, but the type comes from an expression, not a "struct 2022*6881a400Schristos type". */ 2023*6881a400Schristos class unop_cast_type_operation 2024*6881a400Schristos : public maybe_constant_operation<operation_up, operation_up> 2025*6881a400Schristos { 2026*6881a400Schristos public: 2027*6881a400Schristos 2028*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 2029*6881a400Schristos 2030*6881a400Schristos value *evaluate (struct type *expect_type, 2031*6881a400Schristos struct expression *exp, 2032*6881a400Schristos enum noside noside) override 2033*6881a400Schristos { 2034*6881a400Schristos value *val = std::get<0> (m_storage)->evaluate (nullptr, exp, 2035*6881a400Schristos EVAL_AVOID_SIDE_EFFECTS); 2036*6881a400Schristos return std::get<1> (m_storage)->evaluate_for_cast (value_type (val), 2037*6881a400Schristos exp, noside); 2038*6881a400Schristos } 2039*6881a400Schristos 2040*6881a400Schristos enum exp_opcode opcode () const override 2041*6881a400Schristos { return UNOP_CAST_TYPE; } 2042*6881a400Schristos 2043*6881a400Schristos protected: 2044*6881a400Schristos 2045*6881a400Schristos void do_generate_ax (struct expression *exp, 2046*6881a400Schristos struct agent_expr *ax, 2047*6881a400Schristos struct axs_value *value, 2048*6881a400Schristos struct type *cast_type) 2049*6881a400Schristos override; 2050*6881a400Schristos }; 2051*6881a400Schristos 2052*6881a400Schristos typedef value *cxx_cast_ftype (struct type *, value *); 2053*6881a400Schristos 2054*6881a400Schristos /* This implements dynamic_cast and reinterpret_cast. static_cast and 2055*6881a400Schristos const_cast are handled by the ordinary case operations. */ 2056*6881a400Schristos template<exp_opcode OP, cxx_cast_ftype FUNC> 2057*6881a400Schristos class cxx_cast_operation 2058*6881a400Schristos : public maybe_constant_operation<operation_up, operation_up> 2059*6881a400Schristos { 2060*6881a400Schristos public: 2061*6881a400Schristos 2062*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 2063*6881a400Schristos 2064*6881a400Schristos value *evaluate (struct type *expect_type, 2065*6881a400Schristos struct expression *exp, 2066*6881a400Schristos enum noside noside) override 2067*6881a400Schristos { 2068*6881a400Schristos value *val = std::get<0> (m_storage)->evaluate (nullptr, exp, 2069*6881a400Schristos EVAL_AVOID_SIDE_EFFECTS); 2070*6881a400Schristos struct type *type = value_type (val); 2071*6881a400Schristos value *rhs = std::get<1> (m_storage)->evaluate (type, exp, noside); 2072*6881a400Schristos return FUNC (type, rhs); 2073*6881a400Schristos } 2074*6881a400Schristos 2075*6881a400Schristos enum exp_opcode opcode () const override 2076*6881a400Schristos { return OP; } 2077*6881a400Schristos }; 2078*6881a400Schristos 2079*6881a400Schristos using dynamic_cast_operation = cxx_cast_operation<UNOP_DYNAMIC_CAST, 2080*6881a400Schristos value_dynamic_cast>; 2081*6881a400Schristos using reinterpret_cast_operation = cxx_cast_operation<UNOP_REINTERPRET_CAST, 2082*6881a400Schristos value_reinterpret_cast>; 2083*6881a400Schristos 2084*6881a400Schristos /* Multi-dimensional subscripting. */ 2085*6881a400Schristos class multi_subscript_operation 2086*6881a400Schristos : public tuple_holding_operation<operation_up, std::vector<operation_up>> 2087*6881a400Schristos { 2088*6881a400Schristos public: 2089*6881a400Schristos 2090*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 2091*6881a400Schristos 2092*6881a400Schristos value *evaluate (struct type *expect_type, 2093*6881a400Schristos struct expression *exp, 2094*6881a400Schristos enum noside noside) override; 2095*6881a400Schristos 2096*6881a400Schristos enum exp_opcode opcode () const override 2097*6881a400Schristos { return MULTI_SUBSCRIPT; } 2098*6881a400Schristos }; 2099*6881a400Schristos 2100*6881a400Schristos /* The "&&" operator. */ 2101*6881a400Schristos class logical_and_operation 2102*6881a400Schristos : public maybe_constant_operation<operation_up, operation_up> 2103*6881a400Schristos { 2104*6881a400Schristos public: 2105*6881a400Schristos 2106*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 2107*6881a400Schristos 2108*6881a400Schristos value *evaluate (struct type *expect_type, 2109*6881a400Schristos struct expression *exp, 2110*6881a400Schristos enum noside noside) override; 2111*6881a400Schristos 2112*6881a400Schristos enum exp_opcode opcode () const override 2113*6881a400Schristos { return BINOP_LOGICAL_AND; } 2114*6881a400Schristos 2115*6881a400Schristos protected: 2116*6881a400Schristos 2117*6881a400Schristos void do_generate_ax (struct expression *exp, 2118*6881a400Schristos struct agent_expr *ax, 2119*6881a400Schristos struct axs_value *value, 2120*6881a400Schristos struct type *cast_type) 2121*6881a400Schristos override; 2122*6881a400Schristos }; 2123*6881a400Schristos 2124*6881a400Schristos /* The "||" operator. */ 2125*6881a400Schristos class logical_or_operation 2126*6881a400Schristos : public maybe_constant_operation<operation_up, operation_up> 2127*6881a400Schristos { 2128*6881a400Schristos public: 2129*6881a400Schristos 2130*6881a400Schristos using maybe_constant_operation::maybe_constant_operation; 2131*6881a400Schristos 2132*6881a400Schristos value *evaluate (struct type *expect_type, 2133*6881a400Schristos struct expression *exp, 2134*6881a400Schristos enum noside noside) override; 2135*6881a400Schristos 2136*6881a400Schristos enum exp_opcode opcode () const override 2137*6881a400Schristos { return BINOP_LOGICAL_OR; } 2138*6881a400Schristos 2139*6881a400Schristos protected: 2140*6881a400Schristos 2141*6881a400Schristos void do_generate_ax (struct expression *exp, 2142*6881a400Schristos struct agent_expr *ax, 2143*6881a400Schristos struct axs_value *value, 2144*6881a400Schristos struct type *cast_type) 2145*6881a400Schristos override; 2146*6881a400Schristos }; 2147*6881a400Schristos 2148*6881a400Schristos /* This class implements ADL (aka Koenig) function calls for C++. It 2149*6881a400Schristos holds the name of the function to call, the block in which the 2150*6881a400Schristos lookup should be done, and a vector of arguments. */ 2151*6881a400Schristos class adl_func_operation 2152*6881a400Schristos : public tuple_holding_operation<std::string, const block *, 2153*6881a400Schristos std::vector<operation_up>> 2154*6881a400Schristos { 2155*6881a400Schristos public: 2156*6881a400Schristos 2157*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 2158*6881a400Schristos 2159*6881a400Schristos value *evaluate (struct type *expect_type, 2160*6881a400Schristos struct expression *exp, 2161*6881a400Schristos enum noside noside) override; 2162*6881a400Schristos 2163*6881a400Schristos enum exp_opcode opcode () const override 2164*6881a400Schristos { return OP_ADL_FUNC; } 2165*6881a400Schristos }; 2166*6881a400Schristos 2167*6881a400Schristos /* The OP_ARRAY operation. */ 2168*6881a400Schristos class array_operation 2169*6881a400Schristos : public tuple_holding_operation<int, int, std::vector<operation_up>> 2170*6881a400Schristos { 2171*6881a400Schristos public: 2172*6881a400Schristos 2173*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 2174*6881a400Schristos 2175*6881a400Schristos value *evaluate (struct type *expect_type, 2176*6881a400Schristos struct expression *exp, 2177*6881a400Schristos enum noside noside) override; 2178*6881a400Schristos 2179*6881a400Schristos enum exp_opcode opcode () const override 2180*6881a400Schristos { return OP_ARRAY; } 2181*6881a400Schristos 2182*6881a400Schristos private: 2183*6881a400Schristos 2184*6881a400Schristos struct value *evaluate_struct_tuple (struct value *struct_val, 2185*6881a400Schristos struct expression *exp, 2186*6881a400Schristos enum noside noside, int nargs); 2187*6881a400Schristos }; 2188*6881a400Schristos 2189*6881a400Schristos /* A function call. This holds the callee operation and the 2190*6881a400Schristos arguments. */ 2191*6881a400Schristos class funcall_operation 2192*6881a400Schristos : public tuple_holding_operation<operation_up, std::vector<operation_up>> 2193*6881a400Schristos { 2194*6881a400Schristos public: 2195*6881a400Schristos 2196*6881a400Schristos using tuple_holding_operation::tuple_holding_operation; 2197*6881a400Schristos 2198*6881a400Schristos value *evaluate (struct type *expect_type, 2199*6881a400Schristos struct expression *exp, 2200*6881a400Schristos enum noside noside) override 2201*6881a400Schristos { 2202*6881a400Schristos return std::get<0> (m_storage)->evaluate_funcall (expect_type, exp, noside, 2203*6881a400Schristos std::get<1> (m_storage)); 2204*6881a400Schristos } 2205*6881a400Schristos 2206*6881a400Schristos enum exp_opcode opcode () const override 2207*6881a400Schristos { return OP_FUNCALL; } 2208*6881a400Schristos }; 2209*6881a400Schristos 2210*6881a400Schristos } /* namespace expr */ 2211*6881a400Schristos 2212*6881a400Schristos #endif /* EXPOP_H */ 2213