xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/expop.h (revision 6881a4007f077b54e5f51159c52b9b25f57deb0d)
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