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